sunyouyuan 发表于 2009-4-22 13:53:14

关于批量串口数据处理(求助)

现在是两个单片机通过串口_交叉通信,接收都是通过串口中断保存在缓冲数组里实现。我的问题是:是边接收便处理数据好还是等接收缓冲溢出,关闭串口接收中断,等待处理完接收的数据后再打开串口接收中断好?
大家有处理过类似的问题吗?希望指点下,不甚感激

miraclelife 发表于 2009-4-22 15:13:24

边接收边处理好。
如果你的内存够大就设置一个大大的数组比如1K专门用来放数据(视数据量而定),再设定几个标志位:已经处理个字节数,数据接受完毕标志位,数据指针位,等等。

sunyouyuan 发表于 2009-4-22 15:56:26

to miraclelife 麦诺克科技有限公司:
我的串口是循环接收的 置标志位没有用,可能有数据覆盖的可能,其实就是通过串口中断不断读取另一单片机发来的时间 温度 和电压值大家讨论下

miraclelife 发表于 2009-4-22 16:05:14

我没让你在数据缓存中置标志位。而是一个变量,此标志位的意义在于处理了多少条数据,没有多少没有处理的,串口中断里只负责把数据写入缓存,处理数据在另外的函数里,写入数据的地址是不断增加的,处理的也是。这样就可以避免在处理数据的时候丢掉串口发送过来的数据。

sunyouyuan 发表于 2009-4-23 09:33:41

tomiraclelife 麦诺克科技有限公司
谢谢你的回答,你是指用下面这段程序吧?
变量rx_counter ,起什么作用,数据结构学得不好,可以通俗的解释下这个程序的思路吗?谢谢了先



interrupt void usart_rx_isr(void)
{                                                                     
    char status,data;                                       
    status=UCSRA;//读取接收状态标志位,必须先读,当读了UDR后,UCSRA便自动清零了         
    data=UDR;      //读取USART数据寄存器,这句与上句位置不能颠倒的
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)      //判断本接收到的数据是否有数据帧、校验或数据溢出错误(此处指USART的硬件接收溢出)
   {
       rx_buffer=data;//   将数据填充到接收缓冲队列中                                 
       if (++rx_wr_index == RX_BUFFER_SIZE) //写指针指向下一个单元,并判断是否到了队列的尾部,(不表示接受缓冲区是否满!)
            rx_wr_index=0;                  //到了尾部,则指向头部(构成环状)
       if (++rx_counter == RX_BUFFER_SIZE)//队列中收到字符加1,并判断是否队列已满
       {
            rx_counter=0;                   // 队列满了,队列中收到字符个数为0,表示队列中所有以前的数据作废,因为最后的数据已经把最前边的数据覆盖了                                 
            rx_buffer_overflow=1;         //置缓冲区溢出标志。在主程序中必要的地方需要判断该标志,以证明读到数据的完整性
      };
   };
}

sunyouyuan 发表于 2009-4-27 21:31:52

谢谢 大家的关注,问题已经解决

cos 发表于 2014-7-17 18:36:18

怎么解决的?

yayagepei 发表于 2014-7-17 23:16:34

同求解决方案啊!
页: [1]
查看完整版本: 关于批量串口数据处理(求助)