本节主要通过调试串口通信,然后接收传感器数据。首先通过串口工具完成串口通讯调试。从Nano M1 Plus 的扩展接口可以看到有UART1和UART2两个接口。在系统里也可以看到这两个设备。
1,硬件连接:
2,源码 在matrix-masterdemo目录下添加matrix-uart文件夹。在文件夹中添加Matrix-control.c和Makefile文件。 串口通讯代码:
- #include /*标准输入输出定义*/
- #include /*标准函数库定义*/
- #include /*Unix 标准函数定义*/
- #include
- #include
- #include /*文件控制定义*/
- #include /*PPSIX 终端控制定义*/
- #include /*错误号定义*/
- #include
- #include "matrix-uart.h"
- //宏定义
- #define FALSE -1
- #define TRUE 0
- /**
- *@brief 设置串口数据位,停止位和效验位
- *@param fd 类型 int 打开的串口文件句柄
- *@param databits 类型 int 数据位 取值 为 7 或者8
- *@param stopbits 类型 int 停止位 取值为 1 或者2
- *@param parity 类型 int 效验类型 取值为N,E,O,,S
- */
- int set_Parity(int fd,int databits,int stopbits,int parity)
- {
- struct termios options;
- if(tcgetattr(fd,&options) != 0)
- {
- return 0;
- }
- options.c_cflag &= ~CSIZE;
- switch (databits) /*设置数据位数*/
- {
- case 7:
- options.c_cflag |= CS7;
- break;
- case 8:
- options.c_cflag |= CS8;
- break;
- default:
- return (0);
- }
- switch (parity)
- {
- case 'n':
- case 'N':
- options.c_cflag &= ~PARENB; /* Clear parity enable */
- options.c_iflag &= ~INPCK; /* Enable parity checking */
- break;
- case 'o':
- case 'O':
- options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
- options.c_iflag |= INPCK; /* Disnable 漀?朦????????.??.parity checking */
- break;
- case 'e':
- case 'E':
- options.c_cflag |= PARENB; /* Enable parity */
- options.c_cflag &= ~PARODD; /* 转换为偶效验*/
- options.c_iflag |= INPCK; /* Disnable parity checking */
- break;
- case 'S':
- case 's': /*as no parity*/
- options.c_cflag &= ~PARENB;
- options.c_cflag &= ~CSTOPB;break;
- default:
- return 0;
- }
- /* 设置停止位*/
- switch(stopbits)
- {
- case 1:
- options.c_cflag &= ~CSTOPB;
- break;
- case 2:
- options.c_cflag |= CSTOPB;
- break;
- default:
- return 0;
- }
- /* Set input parity option */
- if(parity != 'n')
- options.c_iflag |= INPCK;
- tcflush(fd,TCIFLUSH);
- options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
- options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
- if(tcsetattr(fd,TCSANOW,&options) != 0)
- {
- return 0;
- }
-
- return 1;
- }
- ///////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////
- int open_uart(char* ttyName, int nBaudRate)
- {
- //char szDevFile[20];
- struct termios newtio;
- speed_t speed;
-
- //sprintf(szDevFile, "/dev/ttyS%d", nPort);
- int fd = open(ttyName, O_RDWR | O_NOCTTY);//打开设备
- if(fd < 0)
- {
- goto OpenErr;
- }
- if(tcflush (fd, TCIOFLUSH))
- {
- goto OpenErr;
- }
- tcgetattr(fd, &newtio);
- //B19200 19200波特 B38400 38400波特 B57600 57600波特
- switch(nBaudRate)
- {
- case BAUD4800:
- speed = B4800; break;
- case BAUD9600:
- speed = B9600; break;
- case BAUD19200:
- speed = B19200; break;
- case BAUD38400:
- speed = B38400; break;
- case BAUD57600:
- speed = B57600; break;
- case BAUD115200:
- speed = B115200; break;
- default:
- speed = B9600; break;
- }
-
- newtio.c_cflag = CS8 | CLOCAL | CREAD | speed;
- newtio.c_iflag = IGNPAR;
- newtio.c_oflag = 0;
- newtio.c_lflag = 0;
- newtio.c_cc[VMIN] = 1;
- newtio.c_cc[VTIME] = 0;
- cfsetispeed(&newtio, speed);
- cfsetospeed(&newtio, speed);
- tcsetattr(fd, TCSANOW, &newtio);
- if(set_Parity(fd, 8, 1, 'n'))
- {
- return fd;
- }
-
- OpenErr:
- if(fd >= 0)
- close (fd);
-
- return -1;
- }
- int check_uart(int fd)
- {
- fd_set rd_set;
- struct timeval timeout;
- timeout.tv_sec = 1;
- timeout.tv_usec = 0;
- FD_ZERO(&rd_set);
- FD_SET(fd, &rd_set);
- select(fd+1, &rd_set, NULL, NULL, &timeout);
- if(FD_ISSET(fd, &rd_set))
- {
- return 0;
- }
- return -1;
- }
- int close_uart(int fd)
- {
- if(fd >= 0)
- close(fd);
- return 0;
- }
- int g_uartfd = -1;
- #define UART1_INFO "/dev/ttyS1"
- #define UART2_INFO "/dev/ttyS2"
- int UART0_Recv(int fd, char *rcv_buf,int data_len)
- {
- int len,fs_sel;
- fd_set fs_read;
- struct timeval time;
- FD_ZERO(&fs_read);
- FD_SET(fd,&fs_read);
- time.tv_sec = 10;
- time.tv_usec = 0;
- //使用select实现串口的多路通信
- fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);
- if(fs_sel)
- {
- len = read(fd,rcv_buf,data_len);
- return len;
- }
- else
- {
- printf("Sorry,I am wrong!");
- return FALSE;
- }
-
- }
- int UART0_Send(int fd, char *send_buf,int data_len)
- {
- int len = 0;
- len = write(fd,send_buf,data_len);
- if (len == data_len )
- {
- return len;
- }
- else
- {
-
- tcflush(fd,TCOFLUSH);
- return FALSE;
- }
-
- }
- int main(int argc, char ** argv)
- {
- int len;
- int i;
- char rcv_buf[100];
- g_uartfd = open_uart(UART1_INFO, BAUD115200);
- if(g_uartfd <= 0)
- printf("Can not Open the UART1");
- else
- printf("/dev/ttyS1 open success");
- while (1) //循环读取数据
- {
- len = UART0_Recv(g_uartfd, rcv_buf,8);
- if(len>0)
- {
- for(i=0;i
- printf("%x ",rcv_buf[i]);
- printf("rn");
- UART0_Send(g_uartfd,rcv_buf,len);
- }
- sleep(1);
- }
- close_uart(g_uartfd);
- }
复制代码
3,验证 编辑好源码之后,make编译。然后执行./matrix-uart. 接收到什么发送什么数据。
数据正确。 4,连接传感器采集温湿度数据。
传感器实时采集数据,通过串口发出,接收到的数据如下图。
第三个字节是湿度:62%;第四个字节是温度:33摄氏度。
|