> 文章列表 > 串口数据处理

串口数据处理

串口数据处理

1.在串口接收中断中接收到的数据写入环形缓冲区;唤醒解析线程(发出任务通知)或释放信号量。

2.开一个解析线程:

void AT_Parser()
{while(1){1.等待任务通知;读环形缓冲区(将数据存起来);            2.常规解析(遇到\\r\\n才去解析);解析数据包:1)放入Data_Buf;2)唤醒“等待网络数据的线程”3.唤醒等待at命令的结果的线程;}  
}    

但是在环形缓冲区中大部分时间是没有数据的,如果一直去读环形缓冲区很浪费资源。
引入休眠与唤醒的机制:
1)等待任务通知,休眠状态;如果被唤醒就去读环形缓冲区。
2)使用信号量或事件集。

 3.环形缓冲区:
是全局的数组,但是限定了只有一个生成与一个消费者(不需要保护措施);
在中断函数中会去写环形缓冲区,只有一个解析数据的线程会去读环形缓冲区。
不能有多个线程去读或多个线程去写环形缓冲区;
如果有多个线程去读或多个线程去写环形缓冲区,就需要做好多种保护措施。
 
加了互斥量,A与B就都可以去调用uart_at_send发送函数;如果不加互斥量,A与B只有一个函数可以调用uart_at_send发送函数。

使用信号量表示资源。

 二个线程与一个中断,大部分时间都是不占用系统资源的,代码效率比较高。

 uart_at_send函数阻塞后,要向下继续执行,只能是三个情况中的一种:1.ok唤醒;2.error唤醒;3.超时退出;