Non-standard serial port baud rate setting
////combuad_recv.cpp #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> /*错误号定义*/ #include <string.h>#include <sys/ioctl.h> #include <linux/serial.h>#define FALSE -1 #define TRUE 0/*设置串口最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。struct termio{unsigned short c_iflag; // 输入模式标志unsigned short c_oflag; // 输出模式标志unsigned short c_cflag; // 控制模式标志unsigned short c_lflag; // local mode flagsunsigned char c_line; // line disciplineunsigned char c_cc[NCC]; // control characters};*//***@brief 设置串口通信速率*@param fd 类型 int 打开串口的文件句柄*@param speed 类型 int 串口速度*@return void*/ static int speed_arr[] = { B200, B300, B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400, B57600, B115200, /*B200000,*/ B230400 }; static int name_arr[] = { 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, /*200000,*/ 230400 }; static int set_speed(int fd, int speed) {int i;int status;struct termios Opt;int baud_rate;tcgetattr(fd, &Opt);for (i = 0; i < sizeof(speed_arr)/sizeof(int); i++){if(speed == name_arr[i]){baud_rate = speed_arr[i];if(baud_rate <= B38400){cfsetispeed(&Opt, baud_rate);cfsetospeed(&Opt, baud_rate);}else{Opt.c_cflag |= CBAUDEX;baud_rate -= 4096;/*baud_rate取值为1 ~ 5,分别对应B57600/B115200/B3000000/B6000000/B12000000*/cfsetispeed(&Opt, baud_rate);cfsetospeed(&Opt, baud_rate);}tcflush(fd, TCIOFLUSH);cfsetispeed(&Opt, speed_arr[i]);cfsetospeed(&Opt, speed_arr[i]);status = tcsetattr(fd, TCSANOW, &Opt);if (status != 0){perror("tcsetattr fd");return FALSE;}tcflush(fd,TCIOFLUSH);return TRUE;}}fprintf(stderr, "Unsupported speed\n");return FALSE; }// uart_set_info // 设置为特诉波特率,比如200000 int set_speci_baud(int fd, int baud) {struct serial_struct ss, ss_set;struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt, B38400);cfsetospeed(&Opt, B38400);tcflush(fd, TCIFLUSH);/*handle unrecevie char*/tcsetattr(fd, TCSANOW, &Opt);if((ioctl(fd, TIOCGSERIAL, &ss)) < 0){printf("BAUD: error to get the serial_struct info:%s\n", strerror(errno));return -1;}ss.flags = ASYNC_SPD_CUST;ss.custom_divisor = ss.baud_base / baud;if((ioctl(fd, TIOCSSERIAL, &ss)) < 0){printf("BAUD: error to set serial_struct:%s\n", strerror(errno));return -2;}ioctl(fd, TIOCGSERIAL, &ss_set);printf("BAUD: success set baud to %d,custom_divisor=%d,baud_base=%d\n",baud, ss_set.custom_divisor, ss_set.baud_base);return 0; }/***@brief 设置串口数据位,停止位和效验位*@param fd 类型 int 打开的串口文件句柄*@param databits 类型 int 数据位 取值 为 7 或者8*@param stopbits 类型 int 停止位 取值为 1 或者2*@param parity 类型 int 效验类型 取值为N,E,O,,S*/ static 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 size\n");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 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);}// importantoptions.c_cflag |= CLOCAL | CREAD;options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);options.c_oflag &= ~OPOST;options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);/* Set input parity option */if (parity != 'n')options.c_iflag |= INPCK;tcflush(fd, TCIFLUSH);options.c_cc[VTIME] = 10; /* 设置超时*/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); }static int open_dev(const char *dev) {int fd = open(dev, O_RDWR); //| O_NOCTTY | O_NDELAYif (-1 == fd){perror("can't open serial port");return -1;}else{return fd;} }ssize_t Read1(int fd, char *ptr) {static int read_cnt = 0;static char *read_ptr = NULL;static char read_buf[1024];if (read_cnt <= 0) { again:if (-1 == (read_cnt = read(fd, read_buf,sizeof(read_buf)))) {if (EINTR == errno){fprintf(stdout, "[lgw] we received a int signal. \n");goto again;}return -1;}else if (0 == read_cnt){return 0;}read_ptr = read_buf;}--read_cnt;*ptr = *read_ptr++;return 1; }int main(int argc, char *argv[]) {int fd;int band_rate;int uart_init_interval_second;char *dev;int cnt = -1, i = 0;unsigned char recv_buff[512] = { 0 };char c;if(4 != argc){printf("Usage: %s <rs232_dev> <band_rate> <uart_init_interval_second>\n", argv[0]);return -1;}dev = (char *)argv[1];band_rate = atoi((char *)argv[2]);uart_init_interval_second = atoi((char *)argv[3]); /*if((fd = open_dev(dev)) < 0){printf("can't open port %s \n", dev);return -1;}*/if((fd = open_dev(dev)) < 0){printf("can't open port %s \n", dev);return -1;}else{if(set_speci_baud(fd, band_rate) < 0)//if(set_speci_baud(fd, 500000) < 0) {printf("Set Speed Error set_speci_baud: %d\n",band_rate);close(fd);return -1;}sleep(uart_init_interval_second);// if(set_speed(fd, 115200) < 0)// {// printf("Set Speed Error set_speed\n");// return -1;// }if(set_parity(fd, 8, 1, 'N') < 0){printf("Set Parity Error\n");close(fd);return -1;}sleep(uart_init_interval_second);}while(1){if(1 == Read1(fd, &c)){fprintf(stderr, "c[%c] = 0x%02x \n", c, (unsigned char)c);}}close(fd);return 0; }
转载于:https://www.cnblogs.com/lianghong881018/p/10894737.html
Non-standard serial port baud rate setting相关推荐
- I.MX6 Linux Serial Baud Rate hacking
/********************************************************************************* I.MX6 Linux Seria ...
- VSPD V9版(Virtual Serial Port Driver 9.0)
VSPD V9版(Virtual Serial Port Driver 9.0) 最好用的虚拟串口对: Virtual Serial Port Driver 最新版 Standard V9.0.575 ...
- 关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 注册原理
关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 注册原理分析 一直以来对该程序的注册分析总是针对 vspdpro.exe,没有针对服 ...
- 转:SSP接口 (SYNCHRONOUS SERIAL PORT)
研究SPI接口时,引申出来的SSP:在网上居然没有找到完整的协议规范文档:只好东拼西凑(多数内容来于博文),但还是没搞明白在硬件上如何兼容其他类型的总线,这种兼容有什么好处? A Synchronou ...
- Android 操作串口 (android serial port api)
Android 操作串口 (android serial port api)
- vb.net2019- 串口serial port通信
serial port,即串行端口,现在大多数硬件设备均采用串口技术与计算机相连. Public Class Form1Private Sub GetSerialPortNames()' Show a ...
- Basic serial port listening application
Basic serial port listening application 转载于:https://www.cnblogs.com/pcdmisnc/archive/2010/10/09/1846 ...
- Virtual Serial Port Driver虚拟串口vspd v7.2 下载及破解方法
虚拟串口安装之后,不要立刻运行它.将压缩包内附的用vspdctl.dll文件放到C:\Program Files\Eltima Software\Virtual Serial Port Driver ...
- 解决ubuntu下arduino IDE的Serial Port无法选择问题
刚接触arduino,刚买了个arduino uno的板子(mango的兼容板 ,不得不说,质量还不错.),拿回来就开始折腾,开始在windows上折腾没有问题,近来在windows下工作越来越少,而 ...
最新文章
- 服务器响应丢包了怎么办,服务器丢包的原因有那些
- 推荐系统炼丹笔记:阿里DMIN多重兴趣网络
- Asp.net MVC 中Controller返回值类型ActionResult
- MySQL weekday()函数
- 11下滑半个屏幕_努比亚发布手表手机:柔性屏幕,体积感人
- Git版本控制使用方法入门教程?
- LCD1602(以51单片机为例)
- 从设计者的角度解读ThreadLocal
- java dispose方法_java-dispose方法
- linux的文件permission需要设置,否则会使用as3的urlrequest失败
- java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...
- Pronunciation Difference between /ʌ/ and /ɑ/
- 电磁兼容(EMC)标准结构的划分与分类
- 6西格玛管理法和ISO9000标准(摘录)
- 计算机教室简笔画图片大全集,教室场景画简笔画图片精选
- java+pom.xml+是什么_pom.xml文件是啥
- ALT+回车键 是强制换行的快捷键
- 蓝牙sbc怎么解决_【科普】蓝牙音频常用的编解码格式
- 利用count if()+条件格式突出显示多余的重复值
- Git在windows和linux安装教程
热门文章
- linux srelf 加壳代码,浅谈被加壳ELF文件的DUMP修复
- 软件测试工作都干些什么?
- HTTP请求Content-Type你知道是做什么的吗?
- cookielifetime php_PHP session有效期session.gc_maxlifetime的设置方法
- 如何检查python的库是否安装成功_Python——查看安装位置和安装的库
- 四级口语计算机对话,四级英语口语对话常用的句子
- 增加mysql的sortbuffer_mysql 参数调优(14)之优化filesort sort_buffer_size、innodb_sort_buffer_size...
- 计算机应用技术班级鉴定,大学班级的鉴定评语(精选50条)
- php下的ssm模式,编码风格:Mvc模式下SSM环境,代码分层管理
- STM8学习笔记---PWM互补波形输出