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

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, 下载次数: 34)

评分

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

查看全部评分

toofree 回答时间: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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版