【ok210试用体验】项目篇+物联仓库管理系统+前端数据中心+无线传输04 - 在线问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【ok210试用体验】项目篇+物联仓库管理系统+前端数据中心+无线传输04

himol ( 楼主 ) 2015-10-23 22:26:03  只看该作者 倒序浏览
第四节:数据接收模块

1. 功能描述
接收M0通过Zigbee传输上来的消息,经过接收端的Zigbee,再通过U转串,此线程负责从串口读取消息,并交给数据处理模块,并继续接收消息
2. 数据描述
类型
名称
功能
int
dev_uart_fd
串口文件描述符
linklist
linkHead
数据缓存链表头
pthread_cond_t
cond_analysis
数据处理模块唤醒条件变量
pthread_mutex_t
mutex_linklist
数据缓存保护互斥锁
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)
{
        struct termios options;
        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;

0个回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /6 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-4-25 07:37 , Processed in 0.400441 second(s), Total 34, Slave 24 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表