第四节:数据接收模块
1. 功能描述
接收M0通过Zigbee传输上来的消息,经过接收端的Zigbee,再通过U转串,此线程负责从串口读取消息,并交给数据处理模块,并继续接收消息
2. 数据描述
3. 流程图
1. 详细说明
本线程被创建后,先打开串口ttyUSB0这一设备节点,得到文件描述符dev_uart_fd,通过调用serial_init (dev_uart_fd)来进行串口的初始化;之后线程通过read串口进行睡眠,一旦有数据,就从串口里读取,并判断包头是否正确,若正确则读取数据,加入数据链表缓存.
#include "link_list.h"
#include "data_global.h"
#define LEN_ENV 20
#define LEN_RFID 4
extern int dev_uart_fd;
extern linklist linkHead;
extern pthread_cond_t cond_analysis;
extern pthread_mutex_t mutex_linklist;
void serial_init(int fd)
{
tcgetattr(fd, &options); //读取终端参数
options.c_cflag |= ( CLOCAL | CREAD ); //忽略调制调解器线路状态,使用接收器
options.c_cflag &= ~CSIZE; //清目前字符长度
options.c_cflag &= ~CRTSCTS; //不实用RTS/CTS流控制
options.c_cflag |= CS8; //字符长度设置为8
options.c_cflag &= ~CSTOPB; //设置1个标志位
options.c_iflag |= IGNPAR; //允许输入奇偶校验
options.c_iflag &= ~(ICRNL | IXON); //回车不转为换行,不允许输入时对XON/XOFF流进行控制
options.c_oflag = 0;
options.c_lflag = 0;
cfsetispeed(&options, B115200); //设置波特率为115200
cfsetospeed(&options, B115200);
tcsetattr(fd,TCSANOW,&options); //设置终端参数
}
void *pthread_transfer (void *arg)
{
int i = 0, len;
char flag = 0, check;
link_datatype buf;
linkHead = CreateEmptyLinklist ();
if ((dev_uart_fd = open (DEV_ZIGBEE, O_RDWR)) < 0)
{
perror ("open ttyUSB0");
exit (-1);
}
serial_init (dev_uart_fd);
printf ("pthread_transfer is okn");
while (1)
{
memset (&buf, 0, sizeof (link_datatype));
read (dev_uart_fd, &check, 1);
if (check == 's')
{
check = 0;
read (dev_uart_fd, &check, 1);
if (check == 't')
{
check = 0;
read (dev_uart_fd, &check, 1);
if (check == ':')
{
check = 0;
read (dev_uart_fd, &check, 1);
if (check == 'e')
{
buf.msg_type = 'e';
usleep(1);
if ((len = read (dev_uart_fd, buf.text, LEN_ENV)) != LEN_ENV)
{
for (i = len; i < LEN_ENV; i++)
{
read (dev_uart_fd, buf.text+i, 1);
}
}
flag = 1;
}
else if (check == 'r')
{
buf.msg_type = 'r';
usleep(1);
if ((len = read (dev_uart_fd, buf.text, LEN_RFID)) != LEN_RFID)
{
for (i = len; i < LEN_RFID; i++)
{
read (dev_uart_fd, buf.text+i, 1);
}
}
flag = 1;
}
}
}
}
if (1 == flag)
{
pthread_mutex_lock (&mutex_linklist);
if ((InsertLinknode (buf)) == -1)
{
pthread_mutex_unlock (&mutex_linklist);
printf ("NONMEMn");
}
pthread_mutex_unlock (&mutex_linklist);
flag = 0;
pthread_cond_signal (&cond_analysis);
}
}
return 0;