你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM8 UART1只能接收到5个数据中的最后一个

[复制链接]
lujianhao891204 提问时间:2018-1-24 16:30 /
设置代码:
void UART1_InitCon()
{
  UART1_DeInit();
  UART1_Init((u32)9600,
             UART1_WORDLENGTH_8D,
             UART1_STOPBITS_1,
             UART1_PARITY_NO,
             UART1_SYNCMODE_CLOCK_DISABLE,
             UART1_MODE_RX_ENABLE);

  UART1_Cmd(ENABLE);
  UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);

}

中断接收数据的代码:
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
    ColorData = UART1_ReceiveData8();
    RData = UART1_ReceiveData8();
    GData = UART1_ReceiveData8();
    BData = UART1_ReceiveData8();
    ModeData = UART1_ReceiveData8();
    return;
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
}
现在是我上位机发了5个数据  入0x01 0x00 0x00 0x00 0x01
然后我Debug模式下看到的变量 ColorData、RData 、GData 、BData 、ModeData数据全部都是0x01
如果发送的是 0x01 0x00 0x00 0x00 0x02,则变量 ColorData、RData 、GData 、BData 、ModeData数据全部都是0x02

小弟初出茅庐,还请大神指教

收藏 评论6 发布时间:2018-1-24 16:30

举报

6个回答
hxydj 回答时间:2018-1-24 17:00:05
这样写接收到的数据肯定是一样的,上位机发送5个数据,串口就会进中断5次,每次接收到一个数据就会将接收到的数据赋给这5个变量,所以变量的值都是一样的。在中断里面用数组接收,每进一次中断,数组下标加1,这样才能看到接收到的所有数据。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

wenyangzeng 回答时间:2018-1-24 17:03:20
本帖最后由 wenyangzeng 于 2018-1-24 17:10 编辑

官方例程可参考,接收数据在缓冲 aRxBuffer[RxCounter++]中:

  1. INTERRUPT_HANDLER(UART2_RX_IRQHandler, 21)
  2. {
  3.     /* In order to detect unexpected events during development,
  4.        it is recommended to set a breakpoint on the following instruction.
  5.     */
  6.   if(UART2_GetFlagStatus(UART2_FLAG_RXNE))
  7.     {
  8.     aRxBuffer[RxCounter++] = UART2_ReceiveData8();
  9.    }
  10.   else
  11.     if(UART2_GetFlagStatus(UART2_FLAG_IDLE))
  12.     {
  13.      Clear = UART2->SR;
  14.     Clear = UART2->DR;
  15.     ReceiveState=1;
  16.    }
  17.   
  18.   }
复制代码
USART2.rar (1.09 MB, 下载次数: 36)

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

七哥 回答时间:2018-1-24 17:10:38
______________________________________________
中断接收数据的代码:
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
    ColorData = UART1_ReceiveData8();
    RData = UART1_ReceiveData8();
    GData = UART1_ReceiveData8();
    BData = UART1_ReceiveData8();
    ModeData = UART1_ReceiveData8();
    return;
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
}
_______________________________________________


你这程序不对呀,一次中断,只能接收一个数据,接收完必须中断返回的。

请参考楼上的答案,串口带FIFO的结构就是楼上的程序,大家都是这么用的。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

lujianhao891204 回答时间:2018-1-25 08:06:22
hxydj 发表于 2018-1-24 17:00
这样写接收到的数据肯定是一样的,上位机发送5个数据,串口就会进中断5次,每次接收到一个数据就会将接收到 ...

非常感谢!
lujianhao891204 回答时间:2018-1-25 08:06:53
wenyangzeng 发表于 2018-1-24 17:03
官方例程可参考,接收数据在缓冲 aRxBuffer[RxCounter++]中:

非常感谢!
lujianhao891204 回答时间:2018-1-25 08:11:28
toofree 发表于 2018-1-24 17:10
______________________________________________
中断接收数据的代码:
INTERRUPT_HANDLER(UART1_RX_IRQHa ...

非常感谢!
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版