////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相关推荐

  1. I.MX6 Linux Serial Baud Rate hacking

    /********************************************************************************* I.MX6 Linux Seria ...

  2. VSPD V9版(Virtual Serial Port Driver 9.0)

    VSPD V9版(Virtual Serial Port Driver 9.0) 最好用的虚拟串口对: Virtual Serial Port Driver 最新版 Standard V9.0.575 ...

  3. 关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 注册原理

    关于虚拟串口驱动专业版 Eltima Virtual Serial Port Driver Pro 注册原理分析         一直以来对该程序的注册分析总是针对 vspdpro.exe,没有针对服 ...

  4. 转:SSP接口 (SYNCHRONOUS SERIAL PORT)

    研究SPI接口时,引申出来的SSP:在网上居然没有找到完整的协议规范文档:只好东拼西凑(多数内容来于博文),但还是没搞明白在硬件上如何兼容其他类型的总线,这种兼容有什么好处? A Synchronou ...

  5. Android 操作串口 (android serial port api)

    Android 操作串口 (android serial port api)

  6. vb.net2019- 串口serial port通信

    serial port,即串行端口,现在大多数硬件设备均采用串口技术与计算机相连. Public Class Form1Private Sub GetSerialPortNames()' Show a ...

  7. Basic serial port listening application

    Basic serial port listening application 转载于:https://www.cnblogs.com/pcdmisnc/archive/2010/10/09/1846 ...

  8. Virtual Serial Port Driver虚拟串口vspd v7.2 下载及破解方法

    虚拟串口安装之后,不要立刻运行它.将压缩包内附的用vspdctl.dll文件放到C:\Program Files\Eltima Software\Virtual Serial Port Driver ...

  9. 解决ubuntu下arduino IDE的Serial Port无法选择问题

    刚接触arduino,刚买了个arduino uno的板子(mango的兼容板 ,不得不说,质量还不错.),拿回来就开始折腾,开始在windows上折腾没有问题,近来在windows下工作越来越少,而 ...

最新文章

  1. 服务器响应丢包了怎么办,服务器丢包的原因有那些
  2. 推荐系统炼丹笔记:阿里DMIN多重兴趣网络
  3. Asp.net MVC 中Controller返回值类型ActionResult
  4. MySQL weekday()函数
  5. 11下滑半个屏幕_努比亚发布手表手机:柔性屏幕,体积感人
  6. Git版本控制使用方法入门教程?
  7. LCD1602(以51单片机为例)
  8. 从设计者的角度解读ThreadLocal
  9. java dispose方法_java-dispose方法
  10. linux的文件permission需要设置,否则会使用as3的urlrequest失败
  11. java android 读写西门子PLC数据,包含S7协议和Fetch/Write协议,s7支持200smart,300PLC,1200PLC,1500PLC...
  12. Pronunciation Difference between /ʌ/ and /ɑ/
  13. 电磁兼容(EMC)标准结构的划分与分类
  14. 6西格玛管理法和ISO9000标准(摘录)
  15. 计算机教室简笔画图片大全集,教室场景画简笔画图片精选
  16. java+pom.xml+是什么_pom.xml文件是啥
  17. ALT+回车键 是强制换行的快捷键
  18. 蓝牙sbc怎么解决_【科普】蓝牙音频常用的编解码格式
  19. 利用count if()+条件格式突出显示多余的重复值
  20. Git在windows和linux安装教程

热门文章

  1. linux srelf 加壳代码,浅谈被加壳ELF文件的DUMP修复
  2. 软件测试工作都干些什么?
  3. HTTP请求Content-Type你知道是做什么的吗?
  4. cookielifetime php_PHP session有效期session.gc_maxlifetime的设置方法
  5. 如何检查python的库是否安装成功_Python——查看安装位置和安装的库
  6. 四级口语计算机对话,四级英语口语对话常用的句子
  7. 增加mysql的sortbuffer_mysql 参数调优(14)之优化filesort sort_buffer_size、innodb_sort_buffer_size...
  8. 计算机应用技术班级鉴定,大学班级的鉴定评语(精选50条)
  9. php下的ssm模式,编码风格:Mvc模式下SSM环境,代码分层管理
  10. STM8学习笔记---PWM互补波形输出