打印

不错的**!!!

[复制链接]
楼主: jxyhome
手机看帖
扫描二维码
随时随地手机跟帖
21
walnutcy| | 2007-8-28 13:55 | 只看该作者 回帖奖励 |倒序浏览

只是一种实现方式,但中断要求多的时候就不可取了

只是一种实现方式,但中断要求多的时候就不可取了

串口中断很占系统时间的,

但这种实时解包的方法反应较快,

其实可以用超时解包的方式实现通信协议,系统更加稳定。。。

使用特权

评论回复
22
Autine| | 2007-8-28 16:29 | 只看该作者

精辟

使用特权

评论回复
23
Autine| | 2007-8-28 16:43 | 只看该作者

一直就用这种方法 但感觉程序比较累赘

如下:
        delay = 3000;
        while(RI == 0)
        {                                                       //等待下一个字节
            if (delay-- == 0) return;                           //延时到则退出
        }
        RI = 0;    
        i = SBUF;        


如上这段会重复出现,
如规定              地址  标识符   数据长度  数据
在程序中就会反复的比较每个收到的数据。

新人  望高手再言

使用特权

评论回复
24
Autine| | 2007-8-28 16:46 | 只看该作者

特别是 数据纠错 及出错后的处理

望 教

使用特权

评论回复
25
ideal716| | 2007-8-28 17:20 | 只看该作者

来学习下

使用特权

评论回复
26
oufuqiang| | 2007-8-29 09:12 | 只看该作者

我对通讯很有兴趣.

学习啦.

使用特权

评论回复
27
martial| | 2007-8-29 12:58 | 只看该作者

我也先顶在看!!

使用特权

评论回复
28
huangqi412| | 2007-8-29 15:07 | 只看该作者

学习了

使用特权

评论回复
29
sprawn| | 2007-8-30 09:15 | 只看该作者

没看明白,请教

在我发出STX_CMD命令时,uart-state状态机将进入CMD_START状态,等待下一个命令的输入,而此时命令状态机cmd_state是NO_CMD状态,好了,现在外面发过来一个COST_CMD的命令,由于此时cmd_state正处在NO_CMD的状态,将执行case NO_CMD的语句,也就是将cmd_state的状态进入COST_CMD,然后退出switch语句,这样就相当于没有去执行case COST_CMD状态的指令,这个命令就无效了,不知道我说清楚没有

使用特权

评论回复
30
dudongdao| | 2007-8-30 15:01 | 只看该作者

这个适合一些情况

   这种只能适合一些情况,不能适合所有~~  内存小就换个大点的嘛,现在的单片机差型号那么多,肯定能找到合适的.

使用特权

评论回复
31
jxyhome|  楼主 | 2007-8-30 15:44 | 只看该作者

回29楼

你没有想清楚,我可以将cmd_state默认设置为NO_CMD,来个COST_CMD也就是cmd_state=u8,此时cmd_state = COST_CMD,接下来对命令帧有用数据进行解析.仔细分析下就很清楚的.

30楼说的很对,不是适合所有的情况,但大多数情况下还是合适的,如果通信协议加上上层的GUI设计的,通讯数据传输速度将影响整个设备的响应速度.因为不仅仅要传输数据还要解析,刷屏幕等,速度稍微快点响应上将好多了.

      

使用特权

评论回复
32
x_tin| | 2007-8-30 16:46 | 只看该作者

我搭车 问一下 modbus问题

我在使用modbus RTU 模式时候 遇到超时的问题,也用的是 状态机 站好 功能码 啥的都 接受好了 到了 接受数据那一步了 然后假如 突然 对方不发了 怎么办啊,不就一直 停在那个状态了啊,另一个消息来了 就没法收了呵呵,虽然一般不会出现 但是假如出现了喃  然后就要用到 modbus里面的 间隔判断了 然后那个 间隔时间 太短 就1.5个字符, 这要怎么搞啊,用定时器是不是 可以?   有没其他的方法喃! 因为设备内部 要跟DSP通信,还要跟外部的设备通信 所以就要用到两个串口,如果两个都用定时器的话,那怎么搞 一会定时器还给他们两 用完了.  

使用特权

评论回复
33
jxyhome|  楼主 | 2007-8-30 17:17 | 只看该作者

回楼上的

可以仿下TCP/IP的超时处理机制.
协议每执行到一个状态,进行一次检查.

使用特权

评论回复
34
sprawn| | 2007-8-31 08:52 | 只看该作者

没看明白,请教

使用特权

评论回复
35
dudongdao| | 2007-8-31 15:23 | 只看该作者

我还是觉得 设置缓冲比较好

   开8个BYTE的缓冲足够了~   中断函数只负责接收,在主程序循环中处理.

static void UartInterruptService(void) interrupt 4
{
    ES = 0;
    RI = 0;

    cSerialReciveBuffer[cSerialWriteBufferPos] = cData;    
    
    if(cSerialWriteBufferPos >= UART0_RX_BUFFER_SIZE)
    {
        cSerialWriteBufferPos = 0;
    }
   cSerialReciveNum++;

   ES=1;
}

   //主函数循环处理
     while(cSerialReciveNum)
     {
        }

使用特权

评论回复
36
jxyhome|  楼主 | 2007-8-31 15:41 | 只看该作者

回楼上的

你这种方式极其不好,程序效率低下,不能够老在while(1)循环处理一些东西,降低了程序消息,采取消息机制会好多了,关于你所说的缓冲处理我不做评价.

使用特权

评论回复
37
dudongdao| | 2007-8-31 16:30 | 只看该作者

为什么效率低下,并且极其不好呢

   这个也是收到数据马上处理,如果收到多个就处理多个,设置缓冲就是为了提高效率啊~~  数据不在中断中处理是好事~

使用特权

评论回复
38
jxyhome|  楼主 | 2007-8-31 16:37 | 只看该作者

可以这样理解

while(1)一直被循环调用,一般处理是放在外面再通过消息机制发消息到while(1)里判断处理,如果连串口数据处理也放在while(1)里程序将写的很长,我是比较反对这种将main弄的很长的做法:)

使用特权

评论回复
39
dudongdao| | 2007-8-31 16:46 | 只看该作者

你可以写成一个串口处理的函数呀

   可以编写一个串口处理的函数,把串口数据处理放在一个函数里面,这样你就会觉得舒服多了~  呵呵~~   
  我一直认为提高效率的方法是中断函数尽量精简~~  

使用特权

评论回复
40
dudongdao| | 2007-8-31 17:04 | 只看该作者

我觉得不开缓冲处理串口的很少~~

   大家写串口的时候都是怎么搞的,开缓冲的多还是不开的多,还是刚开始不开,以后成为高手后就开了.

使用特权

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

本版积分规则