打印
[MCU]

模拟UART接收字节个数错误

[复制链接]
2189|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lazybird721|  楼主 | 2013-10-8 18:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用CYPRESS的单片机模拟UART进行接收发送,1位起始,8位数据,无校验位,1位结束。
采用内部24Mhz,115200波特率。
发送功能正常,接收采用INT0。
但是发现接收字节的个数出现错误,比如:“主机发送0x68,单片机接收并打印出来的是0x68 0xff”;
总是在正确的字节后边跟着一个0xFF。
请问这个可能是什么原因造成的??
谢谢。

相关帖子

沙发
ayb_ice| | 2013-10-9 08:21 | 只看该作者
明显软件模拟出错了
应该是开始,停止信号那里有点问题

使用特权

评论回复
板凳
dirtwillfly| | 2013-10-9 09:34 | 只看该作者
楼上说的是

使用特权

评论回复
地板
lazybird721|  楼主 | 2013-10-9 09:47 | 只看该作者
ayb_ice 发表于 2013-10-9 08:21
明显软件模拟出错了
应该是开始,停止信号那里有点问题

有点不明白的是:接收的第一个字节是正确的,说明8位数据读取的时序是正确的,但是后边跟着一个0xff,说明在接收程序的结尾收到一个低电平,然后一直都是高电平,导致软件以为接收到0xff。会不会是我在接收最后一位后时间太短,导致低电平没结束,中断子程序就结束了,然后程序又再一次进入一次中断??
可是我在每次进入接收程序都会清除中断标志,关闭中断。

还有,我的接收中断子程序是接收数据后直接调用发送子程序:
g_rev_chr = TX8_RecByte(); //模拟uart接收一个字节
TX8_SendByte(g_rev_chr);   //模拟uart发送一个字节
请问这样是否妥当??

使用特权

评论回复
5
ayb_ice| | 2013-10-9 10:41 | 只看该作者
最后一位应该是高电平

建议开始位用中断处理,后面8个数据位和停止位用查询处理(中断中查询),接收一个字节后再开中断

使用特权

评论回复
6
lazybird721|  楼主 | 2013-10-9 12:05 | 只看该作者
ayb_ice 发表于 2013-10-9 10:41
最后一位应该是高电平

建议开始位用中断处理,后面8个数据位和停止位用查询处理(中断中查询),接收一个 ...

我的操作是这样的,起始位低电平触发中断,然后在中断子程序中检测延时检测8位数据和停止位。接受完一个字节后发送,然后开中断。

void RECEIVE_ISR()
{
        INT_CLR0 &= ~(0x02);  //清除中断标志
        g_rev_chr = TX8_RecByte(); //模拟uart接收一个字节
        TX8_SendByte(g_rev_chr);   //模拟uart发送一个字节
        M8C_EnableGInt;     //开总中断       
}

结果依旧是接收一个字节,后续发送跟着0xff,可以肯定的是发送代码是正确的。
相当头疼。

使用特权

评论回复
7
ayb_ice| | 2013-10-9 13:41 | 只看该作者
先把发送代码去掉

其次在开中断前清除标志
        g_rev_chr = TX8_RecByte(); //模拟uart接收一个字节
//       TX8_SendByte(g_rev_chr);   //模拟uart发送一个字节

        INT_CLR0 &= ~(0x02);  //清除中断标志
        M8C_EnableGInt;     //开总中断      

使用特权

评论回复
8
lazybird721|  楼主 | 2013-10-10 09:50 | 只看该作者
ayb_ice 发表于 2013-10-9 13:41
先把发送代码去掉

其次在开中断前清除标志

谢谢,我最后解决的方法是加入校验位,虽然多了几个步骤,但总算解决问题了。
非常感谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

67

帖子

0

粉丝