Ubuntu 串口测试
来源:互联网 发布:数据传输软件 编辑:程序博客网 时间:2024/06/14 03:53
1>.虚拟串口测试(http://www.xappsoftware.com/wordpress/2013/10/07/using-virtual-serial-ports-on-linux-ubuntu/?goback=%2Egde_65688_member_5792872722853814274#%21)
windows下有虚拟串口工具。ubuntu下也有:
安装虚拟串口:
sudo apt-get install socat
创建并连接2个虚拟串口
socat -d -d PTY PTY
路径在: /dev/pts 下。
没创建前是没有的,可以用 ls /dev/pts 测试。
打开一个新的终端,并输入命令打开虚拟串口5:
# sudo cat /dev/pts/5
打开另外一个终端,向虚拟串口6发送数据,因为6和5是相通的,所以5会收到数据。
# sudo echo "Hello World" > /dev/pts/6
That’s all, nothing more.
见下图:
没有创建虚拟串口当然不存在,见下图:
2>和minicom的通讯
见下图:
(minicom打开虚拟串口7,向虚拟串口28发送字符,minicom会收到)
3>
最后用自己编写的代码测试,串口源码如下(参考http://blog.csdn.net/u010925447/article/details/72763052):
uart.c
#include <stdio.h> /*标准输入输出定义*/#include <stdlib.h> /*标准函数库定义*/#include <unistd.h> /*Unix 标准函数定义*/#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> /*文件控制定义*/#include <termios.h> /*PPSIX 终端控制定义*/#include <errno.h> /*错误号定义*//**********************************************************************/#define FALSE -1#define TRUE 0/*********************************************************************/#if 0int main(void){ int fd; struct termios Opt;tcgetattr(fd, &Opt); cfsetispeed(&Opt,B19200); /*设置为19200Bps*/ cfsetospeed(&Opt,B19200); tcsetattr(fd,TCANOW,&Opt); /*以读写方式打开串口*/ fd = open( "/dev/ttyS0", O_RDWR); if (-1 == fd){ perror(" 提示错误!"); } }#endif/***@brief 设置串口通信速率*@param fd 类型 int 打开串口的文件句柄*@param speed 类型 int 串口速度*@return void*/int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, };int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, };void set_speed(int fd, int speed){ int i; int status; struct termios Opt; tcgetattr(fd, &Opt); for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) { if (speed == name_arr[i]) { tcflush(fd, TCIOFLUSH); cfsetispeed(&Opt, speed_arr[i]); cfsetospeed(&Opt, speed_arr[i]); status = tcsetattr(fd, TCSANOW, &Opt); if (status != 0) { perror("tcsetattr fd1"); return; } tcflush(fd,TCIOFLUSH); } }}/***@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) { perror("SetupSerial 1"); return(FALSE); } options.c_cflag &= ~CSIZE; switch (databits) /*设置数据位数*/ { case 7: options.c_cflag |= CS7; break; case 8: options.c_cflag |= CS8; break; default: fprintf(stderr,"Unsupported data sizen"); return (FALSE); } 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: fprintf(stderr,"Unsupported parityn"); return (FALSE); } /* 设置停止位*/ switch (stopbits) { case 1: options.c_cflag &= ~CSTOPB; break; case 2: options.c_cflag |= CSTOPB; break; default: fprintf(stderr,"Unsupported stop bitsn"); return (FALSE); } /* 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) { perror("SetupSerial 3"); return (FALSE); } return (TRUE); }/**代码说明:使用串口二测试的,发送的数据是字符,但是没有发送字符串结束符号,所以接收到后,后面加上了结束符号。我测试使用的是单片机发送数据到第二个串口,测试通过。*/int OpenDev(char *Dev){ int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY if (-1 == fd) { perror("Can''t Open Serial Port"); return -1; } else return fd;}int main(int argc, char **argv){ int fd; int nread; char buff[512]={0}; char *dev = "/dev/pts/7";//"/dev/ttyS1"; //串口二 fd = OpenDev(dev); set_speed(fd,19200); if (set_Parity(fd,8,1,'N') == FALSE) { printf("Set Parity Errorn"); exit (0); }while (1) //循环读取数据{ while((nread = read(fd, buff, 512))>0) { printf("nLen=%d\n",nread); // buff[nread+1] = '\0'; printf( "Rx:%s\n", buff); }} //close(fd); // exit (0);}//write: char buffer[1024];int Length;int nByte;nByte = write(fd, buffer ,Length)//read: char buff[1024];int Len;int readByte = read(fd,buff,Len);
uart.c
编译:
gcc uart.c -o uart
执行(此串口打开的是虚拟串口7):
./uart
然后向虚拟串口28发送数据,uart程序会打印收到的长度和数据。只是长度貌似不对???
如下图:
阅读全文
0 0
- Ubuntu 串口测试
- 树莓3(Ubuntu虚拟机编译程序) 串口收发测试
- 在ubuntu的docker容器下测试串口收发
- 串口测试
- 串口测试
- 测试串口线
- 测试串口源代码
- 【转】串口测试方法
- USB-serial 串口测试
- 串口读写测试
- python 串口测试
- 嵌入式串口测试程序代码
- Linux串口测试程序
- 串口测试工具
- 串口测试代码
- Linux串口测试
- Linux串口测试程序
- Linux串口测试应用程序
- 适合新手的Linux发行版
- [转载]如何管理数百个微服务并避免踩坑?
- 12bit灰度图像映射到8bit显示及python 实现
- 欢迎使用CSDN-markdown编辑器
- 数据库事务基础
- Ubuntu 串口测试
- IO多路复用之select总结
- androidstudio module 应用进阶
- Springboot restTempate POST 上传图片
- [转载]微服务实施Spring Cloud中踩过的坑
- No suitable driver found for jdbc:mysql://localhost/mysql
- poj1651矩阵连乘问题
- 欢迎使用CSDN-markdown编辑器
- mysql压缩版安装