1. 代码框架
前面文章已经介绍了AT命令的组成,以及通讯过程。《AT命令使用和简单介绍》。
现在写代码实现AT命令的发送,以及响应数据、URC数据的解析。
代码框架主要是有两个线程。一个线程负责命令发送,并阻塞等待命令响应结果和响应数据;还有一个是数据解析线程,主要是解析AT命令的响应数据已经URC数据,解析的结果和数据会传递给命令发送线程,然后唤醒命令发送线程。大致流程如下:
数据解析线程会调用一个读取一行数据的函数,这个函数会去读取串口的数据,如果读取不到串口数据,那么这个线程就会一直阻塞,直到等到有串口数据的时候,才会发送信号量唤醒这个线程。
然后下面的代码把接收到的数据进行解析。解析完成之后,会发送信号量唤醒AT命令的发送线程。
2. 核心代码介绍
主要核心代码就是这两个线程的代码,以及所调用的函数。
2.1 数据解析线程函数
void at_recv_parser(void *parameter)
{
char recv_line_buff[128] = {
0};
int read_len = 0;
at_resp_t tmp_resp = {
{
0}, 0, 0};
const at_urc_t *urc = NULL;
while (1)
{
read_len = at_recv_readln(recv_line_buff, sizeof(recv_line_buff));
if ( read_len > 0)
{
if ((urc = at_get_urc(recv_line_buff, read_len)) != NULL)
{
/* URC数据处理 */
if (urc->func != NULL)
{
urc->func(recv_line_buff, read_len);
}
}
else
{
/* 命令响应数据处理 */
if (tmp_resp.buf_len < AT_MAX_RESP_LEN)
{
recv_line_buff[++read_len] = '\0';
memcpy(tm