关于批量串口数据处理(求助)
现在是两个单片机通过串口_交叉通信,接收都是通过串口中断保存在缓冲数组里实现。我的问题是:是边接收便处理数据好还是等接收缓冲溢出,关闭串口接收中断,等待处理完接收的数据后再打开串口接收中断好?大家有处理过类似的问题吗?希望指点下,不甚感激 边接收边处理好。
如果你的内存够大就设置一个大大的数组比如1K专门用来放数据(视数据量而定),再设定几个标志位:已经处理个字节数,数据接受完毕标志位,数据指针位,等等。 to miraclelife 麦诺克科技有限公司:
我的串口是循环接收的 置标志位没有用,可能有数据覆盖的可能,其实就是通过串口中断不断读取另一单片机发来的时间 温度 和电压值大家讨论下 我没让你在数据缓存中置标志位。而是一个变量,此标志位的意义在于处理了多少条数据,没有多少没有处理的,串口中断里只负责把数据写入缓存,处理数据在另外的函数里,写入数据的地址是不断增加的,处理的也是。这样就可以避免在处理数据的时候丢掉串口发送过来的数据。 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; //置缓冲区溢出标志。在主程序中必要的地方需要判断该标志,以证明读到数据的完整性
};
};
} 谢谢 大家的关注,问题已经解决 怎么解决的? 同求解决方案啊!
页:
[1]