打印
[51单片机]

C8051F340单片机串口通讯问题

[复制链接]
3239|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
colily|  楼主 | 2013-7-23 19:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人最近在做一个题目,要求串口通讯速度快速且不能丢码,目前使用57600的波特率上位机发下指令时单片机都会响应,但是改为115200后(其他的部分都不改),有时会对上位机发下的指令不响应,调了一整天了,感觉还是没什么头绪,希望大虾们伸出援助之手。串口程序如下:
void UART0_ISR(void) interrupt UART0_VECTOR
{
        if(RI0)
        {
                RI0=0;
                RxdReg=SBUF0;
                                           RXDdata[UARTRecCnt++] = RxdReg;
                                           if(UARTRecCnt>DataLen)//接受数据长于限定值归零
                     {UARTRecCnt=0;}
                                          if(RXDdata[0]=='$'&&RXDdata[UARTRecCnt-1]==0xFE)//判断一条完整指令
                                          {CMDExplain(RXDdata);ClrRXDdata(RXDdata);UARTRecCnt=0;}执行命令解析并返回数据                     
        }

}

相关帖子

沙发
popeye021| | 2013-7-23 19:34 | 只看该作者
减少中断函数力的操作呢?上下位机的波特率设置一致嘛?

使用特权

评论回复
板凳
ningling_21| | 2013-7-23 19:42 | 只看该作者
十有**是程序的问题...

使用特权

评论回复
地板
colily|  楼主 | 2013-7-23 19:43 | 只看该作者
popeye021 发表于 2013-7-23 19:34
减少中断函数力的操作呢?上下位机的波特率设置一致嘛?

上下位机的波特率是一致的,函数中只是对上位机命令的解析,就是一个switch函数,不会占用中断太多时间,上位机发指令的频率非常的快,在波特率为115200的时候大多数时候指令都能得到解析和返回,只有偶尔会有几条指令不会返回。但是下位机要求每条指令都要返回。

使用特权

评论回复
5
colily|  楼主 | 2013-7-23 19:48 | 只看该作者
ningling_21 发表于 2013-7-23 19:42
十有**是程序的问题...

我也觉得是我的程序还有问题,我在线调试的时候发现出现没有返回的时候,RXDdata数组里的数据跟我发下的数据排序不一样,我认为是数组里UARTRecCnt没有被清掉,但是我每条指令解析完都会把它清掉的。

使用特权

评论回复
6
ningling_21| | 2013-7-23 19:51 | 只看该作者
colily 发表于 2013-7-23 19:48
我也觉得是我的程序还有问题,我在线调试的时候发现出现没有返回的时候,RXDdata数组里的数据跟我发下的 ...

只有一处清除是不够的,有时需多加几处...

使用特权

评论回复
7
colily|  楼主 | 2013-7-23 19:56 | 只看该作者
ningling_21 发表于 2013-7-23 19:51
只有一处清除是不够的,有时需多加几处...

我是在解析完指令后就将它清零掉的啊,其他地方也没必要吧!

使用特权

评论回复
8
ningling_21| | 2013-7-23 22:05 | 只看该作者
colily 发表于 2013-7-23 19:56
我是在解析完指令后就将它清零掉的啊,其他地方也没必要吧!

这样的问题,也许多调试几次就会发现问题在哪了。。。。

使用特权

评论回复
9
ayb_ice| | 2013-7-24 08:02 | 只看该作者
中断里不要解释命令,放在主循环完成

使用特权

评论回复
10
colily|  楼主 | 2013-7-24 12:49 | 只看该作者
ayb_ice 发表于 2013-7-24 08:02
中断里不要解释命令,放在主循环完成

因为程序里还有其它中断,而且中断频率比较高,解析放到主循环里响应会很慢,而且命令发的快时就会出错!

使用特权

评论回复
11
ayb_ice| | 2013-7-24 14:00 | 只看该作者
本帖最后由 ayb_ice 于 2013-7-24 14:02 编辑

使用队列缓冲

中断程序臃肿,中断又多又快,CPU当然处理不过来了,要么提高CPU速度,要么降低通信速率,要么改进程序结构...

使用特权

评论回复
12
bhj2020| | 2013-7-24 16:42 | 只看该作者
程序容错有问题,当rxddata[0]出现干扰不等于$时,将会丢失后续若干条命令。

使用特权

评论回复
13
colily|  楼主 | 2013-7-24 20:44 | 只看该作者
bhj2020 发表于 2013-7-24 16:42
程序容错有问题,当rxddata[0]出现干扰不等于$时,将会丢失后续若干条命令。 ...

那应当怎么解决呢!这里有点迷惑!

使用特权

评论回复
14
colily|  楼主 | 2013-7-24 20:48 | 只看该作者
ayb_ice 发表于 2013-7-24 14:00
使用队列缓冲

中断程序臃肿,中断又多又快,CPU当然处理不过来了,要么提高CPU速度,要么降低通信速率,要么改 ...

cpu已经没办法改了!要求没法变了!那我的程序结构要怎么去改呢!顺序结构加中断啊!

使用特权

评论回复
15
ningling_21| | 2013-7-24 21:38 | 只看该作者
colily 发表于 2013-7-24 20:48
cpu已经没办法改了!要求没法变了!那我的程序结构要怎么去改呢!顺序结构加中断啊! ...

解析数据放在主程序中,不要在中断中...

使用特权

评论回复
16
colily|  楼主 | 2013-7-24 22:30 | 只看该作者
ningling_21 发表于 2013-7-24 21:38
解析数据放在主程序中,不要在中断中...

行不通!有另外的中断会干扰解析函数!导致命令无响应!

使用特权

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

本版积分规则

1

主题

9

帖子

0

粉丝