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

stm8s105 UART2接收问题

[复制链接]
00xiaodong 提问时间:2015-6-4 15:38 /
我参考别人的UART2的发送和接收程序入下(与主CPU通信)。现在面临的问题是,在我给CPU发送请求后,如果主CPU不给答复,那么我的程序就会一直在(1)处进入死循环,我该怎么修改跳出循环而不影响string5的赋值。

u8 UART2_ReceiveByte(void)
{
  while (!(UART2_SR & UART2_FLAG_RXNE));//  (1)
  USART2_RX_BUF=(uint8_t)UART2_DR;
  return USART2_RX_BUF;
}

void UART2_SendByte(u8 data)
{
        UART2_DR=data;       
        while (!(UART2_SR & UART2_FLAG_TXE));
}
main()
{
uchar lcd_addy=0;
uchar j=10;
while (lcd_addy<22)        //等待主CPU启动完成并返回当前属性值,CPU答复22个字符
        {
               
                while(j)            //向主机发送10次请求命令
                        {
                                UART2_SendByte(0xff);  //单片机向主CPU发送获取当前显示命令请求
                                UART2_SendByte(0x04);
                                UART2_SendByte(0x00);
                                j--;
                        }
                UART2_ReceiveByte();
                string5[lcd_addy]=USART2_RX_BUF;
                lcd_addy++;
               
        }

收藏 评论15 发布时间:2015-6-4 15:38

举报

15个回答
zhuoyemp4 回答时间:2015-6-4 15:43:24
本帖最后由 zhuoyemp4 于 2015-6-4 15:51 编辑

最完美的解决是用串口接收中断,这样不管你接收多少数据,实时性能保证。


你好我好大家好! 回答时间:2015-6-4 15:50:48
不太明白
zhuoyemp4 回答时间:2015-6-4 15:55:31
如果你非要用这种方式,那么在while循环里给某个变量自加1,作计时用,到这个时间就用break语句退出while
00xiaodong 回答时间:2015-6-4 16:03:17
zhuoyemp4 发表于 2015-6-4 15:55
如果你非要用这种方式,那么在while循环里给某个变量自加1,作计时用,到这个时间就用break语句退出while ...

这种方法我试了,不行,因为string5[lcd_addy]=USART2_RX_BUF;这句会将不确定的值赋给string5,当CPU再发送22个字符的时候,前边的几个就变成不确定的值了。
00xiaodong 回答时间:2015-6-4 16:03:43
无力回天 回答时间:2015-6-4 16:04:23
借鉴官网吧
zhuoyemp4 回答时间:2015-6-4 16:04:55
00xiaodong 发表于 2015-6-4 16:03
这种方法我试了,不行,因为string5[lcd_addy]=USART2_RX_BUF;这句会将不确定的值赋给string5,当CPU再发 ...

那就用串口中断吧
00xiaodong 回答时间:2015-6-4 16:05:21
zhuoyemp4 发表于 2015-6-4 15:43
最完美的解决是用串口接收中断,这样不管你接收多少数据,实时性能保证。

我有4个地方用到接收,而且接收到的数据存在不同的变量里了,用中断是不是没法解决?
00xiaodong 回答时间:2015-6-4 16:07:08
zhuoyemp4 发表于 2015-6-4 16:04
那就用串口中断吧

我有4个地方用到接收,而且接收到的数据存在不同的变量里了,用中断是不是没法解决?
zhuoyemp4 回答时间:2015-6-4 16:09:01
00xiaodong 发表于 2015-6-4 16:05
我有4个地方用到接收,而且接收到的数据存在不同的变量里了,用中断是不是没法解决? ...

为什么不能呢?先搞清通信协议
00xiaodong 回答时间:2015-6-4 16:15:37
zhuoyemp4 发表于 2015-6-4 16:09
为什么不能呢?先搞清通信协议

额,我是这样想的,您给我看看我的想法对不对。
我的流水线是0123456789这10步,我要在2处接收CPU命令,并把在这个命令显示出来,但是CPU没有在2处给我,而是在5处给我了,那我现在已经过了第二步,不需要显示了,那接收到CPU命令也没用了啊
00xiaodong 回答时间:2015-6-4 16:16:41

有地址吗
zhuoyemp4 回答时间:2015-6-4 16:22:30
00xiaodong 发表于 2015-6-4 16:15
额,我是这样想的,您给我看看我的想法对不对。
我的流水线是0123456789这10步,我要在2处接收CPU命令, ...

串口一直等待接收,接收到数据了,你再判断你的流水线是到哪一步了,如果接收到的命令不符合要求那就不用接收到的数据。
00xiaodong 回答时间:2015-6-4 16:27:16
zhuoyemp4 发表于 2015-6-4 16:22
串口一直等待接收,接收到数据了,你再判断你的流水线是到哪一步了,如果接收到的命令不符合要求那就不用 ...

哦,这样应该可以。谢谢
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版