模拟串口通信求帮助

[复制链接]
4517|20
 楼主| cshij2009 发表于 2012-3-28 22:06 | 显示全部楼层 |阅读模式
我用两个芯片做串口通信,一个芯片循环发送0到255的数据;另一个芯片每次按键之后接收三个数据,理论上三个数据应该连续。现在问题是,每接收两百次的时候出现一次错误,如0x03,0x04,0xfe。错误数据的规律是,两个数据连续,另一个数据高四位是全1,低四位任意,即0xfx.。数据采用偶校验,9600波特率。我用芯片给PC发送数据,PC接收数据完全正确,由此判断接收程序有问题,我把接收中断的流程图传上来,希望大家帮助

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
NE5532 发表于 2012-3-28 22:18 | 显示全部楼层
楼主做的是软串口?进来的那个中断是什么中断?定时器的中断?外中断?怎么触发的?启动位怎么检测的?非要用软串口?还必须用定时器?
 楼主| cshij2009 发表于 2012-3-29 07:53 | 显示全部楼层
是的,我做的是软串口。1S定时时间到,初始化捕获比较控制寄存器(开中断,下降沿捕获,捕获源),捕获到下降沿,进入接收中断,开始接收数据。接收数据的启动位是下降沿捕获的,在接收数据中,用的定时来接收数据。
joyme 发表于 2012-3-29 10:09 | 显示全部楼层
1S定时到开始开捕获中断,太容易把数据位的下降沿当初起始位了,串口通信是异步的,一个连续发送,一个随机接收必然会出错
 楼主| cshij2009 发表于 2012-3-29 10:42 | 显示全部楼层
4# joyme 2S的定时我也试过啦,可是有错误啊
g1234567 发表于 2012-3-29 11:08 | 显示全部楼层
看流程图是11位传输吧,一个字节时间11*1/9600s,1S定时捕捉起始位,不知道掉了多少个数据.
g1234567 发表于 2012-3-29 11:22 | 显示全部楼层
捕捉起始位的时间最少是每位的传输时间的1/2,即每位的传输时间中捕捉2次及以上(这个还与硬件有关)。
 楼主| cshij2009 发表于 2012-3-29 11:24 | 显示全部楼层
6# g1234567 好象我没有说清楚,我的这个定时时间是,每次1S定时时间到,捕获起始位,开始接收数据,接收完数据,关闭中断,把接收的数据显示出来,下一个1S定时时间到,再次开始捕获起始位,接收数据。
g1234567 发表于 2012-3-29 11:35 | 显示全部楼层
没看见怎么判断起始位的
g1234567 发表于 2012-3-29 11:39 | 显示全部楼层
呵呵。。。是4楼说的原因!
NE5532 发表于 2012-3-29 12:19 | 显示全部楼层
呵呵。。。是4楼说的原因!
g1234567 发表于 2012-3-29 11:39


呵呵,所以楼主只要把我提的几个问题过一下,自己都知道错了。1秒1次,咋能同到步呢~?还有楼主啊,只要没有其他任务需要同时做,软件串口最简单的方法就是用硬延时来做,定时器是最复杂的一种方法,如无必要,纯属自虐。
g1234567 发表于 2012-3-29 13:10 | 显示全部楼层
g1234567发表于 2012-3-24 15:13 | 只看该作者 回复 引用 编辑 评分 返回版面 TOP  得分:0
22楼: 定时器模拟的,怀疑:接收程序的起始位判断上的时序可能有问题:定时器用的几倍速率侦测端口的?什么情况下为起始位,起始位为多长时间有效。。。。

:dizzy:
我不是LZ呢
我24日就说过类似问题,LZ自己不去看,也不分析
zh_2608 发表于 2012-3-29 17:12 | 显示全部楼层
没学好
 楼主| cshij2009 发表于 2012-3-29 21:10 | 显示全部楼层
12# g1234567 你说的我不是很理解,我程序中是捕获到下降沿的时候就认为是起始位,没有判断起始位是多长时间,难道还要判断起始位的时间吗?
 楼主| cshij2009 发表于 2012-3-29 21:19 | 显示全部楼层
11# NE5532 我用的芯片是MSP430F413,没有硬件串口,只能用软串口啦!我现在打算,接收端发送接收申请,当发送端接收到发送申请的时候,发送数据。我现在糊涂的是,这样我接收数据只要判断是下降沿就可以接收数据吧,我看到7楼怎么说要判断捕捉起始位的时间呢?
g1234567 发表于 2012-3-30 09:32 | 显示全部楼层
自己2台设备之间的通讯,自己想怎么弄都可以,也不一定要严格按串口来做。
g1234567 发表于 2012-3-30 09:46 | 显示全部楼层
标准UART接收端采样时钟频率是传输的波特率的16/64倍;
标准UART的RXD前端有一个"1到0跳变检测器",当其连续接受到8个RXD上的地电平时,该检测器就认为RXD线出现了起始位,进入接受数据状态.
在接受状态,接受控制器对数据位7,8,9三个脉冲采样,并遵从三中取二的原则确定最终值.采用这一方法的根本目的还是为了增强抗干扰,提高数据传送的可靠性,采样信号总是在每个接受位的中间位置,可以避开数据位两端的边沿失真,也可以防止接受时钟频率和发送时钟频率不完全同步引起的误差.
joyme 发表于 2012-3-30 10:58 | 显示全部楼层
15楼: 11# NE5532 我用的芯片是MSP430F413,没有硬件串口,只能用软串口啦!我现在打算,接收端发送接收申请,当发送端接收到发送申请的时候,发送数据。我现在糊涂的是,这样我接收数据只要判断是下降沿就可以接收数据吧,我看到7楼怎么说要判断捕捉起始位的时间呢?
这样不如模拟IIC,速度还可以快很多
NE5532 发表于 2012-3-30 20:36 | 显示全部楼层
这样不如模拟IIC,速度还可以快很多
joyme 发表于 2012-3-30 10:58


那还不如模拟SPI,速度快几十倍,程序也简单几十倍。
 楼主| cshij2009 发表于 2012-4-10 20:46 | 显示全部楼层
4# joyme
您说的很有道理,我改了一种发送数据方式,就没有错误啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

73

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部