日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Nanopi NEO Air串口代码

發(fā)布時間:2025/6/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nanopi NEO Air串口代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Nanopi NEO Air串口代碼/**------------------------------------------FileInfo------------------------------------------------------- ** File name: main.c ** Last modified Date: 2011-01-31 ** Last Version: 1.0 ** Descriptions: **------------------------------------------------------------------------------------------------------ ** Created by: ** Created date: 2017-06-16 ** Version: 1.0 ** Descriptions: The original version **------------------------------------------------------------------------------------------------------ ** Modified by: ** Modified date: ** Version: ** Descriptions: *******************************************************************///串口相關的頭文件 #include<stdio.h> /*標準輸入輸出定義*/ #include<stdlib.h> /*標準函數(shù)庫定義*/ #include<unistd.h> /*Unix 標準函數(shù)定義*/ #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> /*文件控制定義*/ #include<termios.h> /*PPSIX 終端控制定義*/ #include<errno.h> /*錯誤號定義*/ #include<string.h>//宏定義 #define FALSE -1 #define TRUE 0/******************************************************************* * 名稱: UART0_Open * 功能: 打開串口并返回串口設備文件描述 * 入口參數(shù): fd :文件描述符 port :串口號(ttyS0,ttyS1,ttyS2) * 出口參數(shù): 正確返回為1,錯誤返回為0 *******************************************************************/ int UART0_Open(int fd,char* port) {fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY); if (FALSE == fd) { perror("Can't Open Serial Port"); return(FALSE); }//恢復串口為阻塞狀態(tài) if(fcntl(fd, F_SETFL, 0) < 0) { printf("fcntl failed!\n"); return(FALSE); } else {printf("fcntl=%d\n",fcntl(fd, F_SETFL,0)); }//測試是否為終端設備 if(0 == isatty(STDIN_FILENO)){ printf("standard input is not a terminal device\n"); return(FALSE);} else { printf("isatty success!\n"); } printf("fd->open=%d\n",fd); return fd; } /******************************************************************* * 名稱: UART0_Close * 功能: 關閉串口并返回串口設備文件描述 * 入口參數(shù): fd :文件描述符 port :串口號(ttyS0,ttyS1,ttyS2) * 出口參數(shù): void *******************************************************************/void UART0_Close(int fd) {close(fd); }/******************************************************************* * 名稱: UART0_Set * 功能: 設置串口數(shù)據(jù)位,停止位和效驗位 * 入口參數(shù): fd 串口文件描述符 * speed 串口速度 * flow_ctrl 數(shù)據(jù)流控制 * databits 數(shù)據(jù)位 取值為 7 或者8 * stopbits 停止位 取值為 1 或者2 * parity 效驗類型 取值為N,E,O,,S *出口參數(shù): 正確返回為1,錯誤返回為0 *******************************************************************/ int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity) { int i; int status; int speed_arr[] = { B115200, B19200, B9600, B4800, B2400, B1200, B300}; int name_arr[] = {115200, 19200, 9600, 4800, 2400, 1200, 300};struct termios options;/*tcgetattr(fd,&options)得到與fd指向?qū)ο蟮南嚓P參數(shù),并將它們保存于options,該函數(shù)還可以測試配置是否正確,該串口是否可用等。若調(diào)用成功,函數(shù)返回值為0,若調(diào)用失敗,函數(shù)返回值為1.*/if ( tcgetattr( fd,&options) != 0) { perror("SetupSerial 1"); return(FALSE); }//設置串口輸入波特率和輸出波特率for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) { if (speed == name_arr[i]) { cfsetispeed(&options, speed_arr[i]); cfsetospeed(&options, speed_arr[i]); } } //修改控制模式,保證程序不會占用串口options.c_cflag |= CLOCAL;//修改控制模式,使得能夠從串口中讀取輸入數(shù)據(jù)options.c_cflag |= CREAD;//設置數(shù)據(jù)流控制switch(flow_ctrl){case 0 ://不使用流控制options.c_cflag &= ~CRTSCTS;break; case 1 ://使用硬件流控制options.c_cflag |= CRTSCTS;break;case 2 ://使用軟件流控制options.c_cflag |= IXON | IXOFF | IXANY;break;}//設置數(shù)據(jù)位//屏蔽其他標志位options.c_cflag &= ~CSIZE;switch (databits){ case 5: options.c_cflag |= CS5; break;case 6: options.c_cflag |= CS6; break;case 7: options.c_cflag |= CS7; break;case 8: options.c_cflag |= CS8; break; default: fprintf(stderr,"Unsupported data size\n"); return (FALSE); }//設置校驗位switch (parity){ case 'n':case 'N': //無奇偶校驗位。 options.c_cflag &= ~PARENB; options.c_iflag &= ~INPCK; break; case 'o': case 'O'://設置為奇校驗 options.c_cflag |= (PARODD | PARENB); options.c_iflag |= INPCK; break; case 'e': case 'E'://設置為偶校驗 options.c_cflag |= PARENB; options.c_cflag &= ~PARODD; options.c_iflag |= INPCK; break;case 's':case 'S': //設置為空格 options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; break; default: fprintf(stderr,"Unsupported parity\n"); return (FALSE); } // 設置停止位 switch (stopbits){ case 1: options.c_cflag &= ~CSTOPB; break; case 2: options.c_cflag |= CSTOPB; break;default: fprintf(stderr,"Unsupported stop bits\n"); return (FALSE);}//修改輸出模式,原始數(shù)據(jù)輸出 options.c_oflag &= ~OPOST;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);//我加的 //options.c_lflag &= ~(ISIG | ICANON);//設置等待時間和最小接收字符options.c_cc[VTIME] = 1; /* 讀取一個字符等待1*(1/10)s */ options.c_cc[VMIN] = 1; /* 讀取字符的最少個數(shù)為1 *///如果發(fā)生數(shù)據(jù)溢出,接收數(shù)據(jù),但是不再讀取 刷新收到的數(shù)據(jù)但是不讀tcflush(fd,TCIFLUSH);//激活配置 (將修改后的termios數(shù)據(jù)設置到串口中)if (tcsetattr(fd,TCSANOW,&options) != 0) { perror("com set error!\n"); return (FALSE); }return (TRUE); } /******************************************************************* * 名稱: UART0_Init() * 功能: 串口初始化 * 入口參數(shù): fd : 文件描述符 * speed : 串口速度 * flow_ctrl 數(shù)據(jù)流控制 * databits 數(shù)據(jù)位 取值為 7 或者8 * stopbits 停止位 取值為 1 或者2 * parity 效驗類型 取值為N,E,O,,S * * 出口參數(shù): 正確返回為1,錯誤返回為0 *******************************************************************/ int UART0_Init(int fd, int speed,int flow_ctrl,int databits,int stopbits,int parity) {int err;//設置串口數(shù)據(jù)幀格式if (UART0_Set(fd,115200,0,8,1,'N') == FALSE) { return FALSE; }else { return TRUE; } }/******************************************************************* * 名稱: UART0_Recv * 功能: 接收串口數(shù)據(jù) * 入口參數(shù): fd :文件描述符 * rcv_buf :接收串口中數(shù)據(jù)存入rcv_buf緩沖區(qū)中 * data_len :一幀數(shù)據(jù)的長度 * 出口參數(shù): 正確返回為1,錯誤返回為0 *******************************************************************/ 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實現(xiàn)串口的多路通信fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);if(fs_sel) { len = read(fd,rcv_buf,data_len); printf("I am right!(version1.2) len = %d fs_sel = %d\n",len,fs_sel); return len; }else { printf("Sorry,I am wrong!"); return FALSE; } } /******************************************************************** * 名稱: UART0_Send * 功能: 發(fā)送數(shù)據(jù) * 入口參數(shù): fd :文件描述符 * send_buf :存放串口發(fā)送數(shù)據(jù) * data_len :一幀數(shù)據(jù)的個數(shù) * 出口參數(shù): 正確返回為1,錯誤返回為0 *******************************************************************/ 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 fd; //文件描述符int err; //返回調(diào)用函數(shù)的狀態(tài)int len; int i;char rcv_buf[100]; // char send_buf_1[12]="CLS(0);\n"; // char send_buf_2[30]="DS32(0,0,'姓名:何志強',1);\n"; // char send_buf_3[30]="DS32(0,32,'年齡:24',1);\n"; // char send_buf_4[35]="DS32(0,64,'聯(lián)系電話:110',1);\n"; // char send_buf_5[45]="DS32(0,100,'地址:西安科技大學北',1);\n"; // char send_buf_6[40]="DS32(96,132,'校區(qū),雁塔中路5',1);\n"; // char send_buf_7[35]="DS32(96,164,'8號',1);\n"; //; char send_buf_1[12]="SPG(1);\n"; char send_buf_2[12]="SPG(2);\n" char send_buf_3[12]="SPG(3);\n" /*if(argc != 3) { printf("Usage: %s /dev/ttySn 0(send data)/1 (receive data) \n",argv[0]); return FALSE; }*/fd = UART0_Open(fd,"/dev/ttyS1"); //打開串口,返回文件描述符do{ err = UART0_Init(fd,115200,0,8,1,'N'); printf("Set Port Exactly!\n");}while(FALSE == err || FALSE == fd);if(0 == strcmp(argv[1],"0")) { len = UART0_Send(fd,send_buf_1,12); if(len > 0) printf("send data successful\n"); else printf("send data failed!\n"); sleep(1);len = UART0_Send(fd,send_buf_2,30); if(len > 0) printf(" send data successful\n"); else printf("send data failed!\n"); sleep(1);len = UART0_Send(fd,send_buf_3,30); if(len > 0) printf("send data successful\n"); else printf("send data failed!\n"); sleep(1);// len = UART0_Send(fd,send_buf_4,sizeof(send_buf_4)); // if(len > 0) // printf("send data successful\n"); // else // printf("send data failed!\n"); // sleep(1);// len = UART0_Send(fd,send_buf_5,sizeof(send_buf_5)); // if(len > 0) // printf("send data successful\n"); // else // printf("send data failed!\n"); // sleep(1);// len = UART0_Send(fd,send_buf_6,sizeof(send_buf_6)); // if(len > 0) // printf("send data successful\n"); // else // printf("send data failed!\n"); // sleep(1);// len = UART0_Send(fd,send_buf_7,sizeof(send_buf_7)); // if(len > 0) // printf("send data successful\n"); // else // printf("send data failed!\n"); // sleep(1); /* for(i = 0;i < 10;i++) { len = UART0_Send(fd,send_buf,10); if(len > 0) printf(" %d send data successful\n",i); else printf("send data failed!\n"); sleep(2); }*/ UART0_Close(fd); }else { while (1) //循環(huán)讀取數(shù)據(jù) { len = UART0_Recv(fd, rcv_buf,9); if(len > 0) { rcv_buf[len] = '\0'; printf("receive data is %s\n",rcv_buf); printf("len = %d\n",len); } else { printf("cannot receive data\n"); } sleep(2); } UART0_Close(fd); } }/********************************************************************* End Of File ** *******************************************************************/

總結(jié)

以上是生活随笔為你收集整理的Nanopi NEO Air串口代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。