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 flags
unsigned char c_line; // line discipline
unsigned 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[] = { , , , , , , , , , , , , /*200000,*/ };
static int set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
int baud_rate; tcgetattr(fd, &Opt); for (i = ; 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 -= ;/*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 != )
{
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)) < )
{
printf("BAUD: error to get the serial_struct info:%s\n", strerror(errno));
return -;
} ss.flags = ASYNC_SPD_CUST;
ss.custom_divisor = ss.baud_base / baud;
if((ioctl(fd, TIOCSSERIAL, &ss)) < )
{
printf("BAUD: error to set serial_struct:%s\n", strerror(errno));
return -;
} 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 ;
} /**
*@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) != )
{
perror("SetupSerial 1");
return(FALSE);
} options.c_cflag &= ~CSIZE;
switch (databits) /*设置数据位数*/
{
case :
options.c_cflag |= CS7;
break;
case :
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 :
options.c_cflag &= ~CSTOPB;
break;
case :
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
} // important
options.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] = ; /* 设置超时*/
options.c_cc[VMIN] = ; /* Update the options and do it NOW */ if (tcsetattr(fd, TCSANOW, &options) != )
{
perror("SetupSerial 3");
return (FALSE);
} return (TRUE);
} static int open_dev(const char *dev)
{
int fd = open(dev, O_RDWR); //| O_NOCTTY | O_NDELAY
if (- == fd)
{
perror("can't open serial port");
return -;
}
else
{
return fd;
}
} ssize_t Read1(int fd, char *ptr)
{
static int read_cnt = ;
static char *read_ptr = NULL;
static char read_buf[]; if (read_cnt <= )
{
again:
if (- == (read_cnt = read(fd, read_buf,
sizeof(read_buf))))
{
if (EINTR == errno)
{
fprintf(stdout, "[lgw] we received a int signal. \n");
goto again;
} return -;
}
else if ( == read_cnt)
{
return ;
} read_ptr = read_buf;
} --read_cnt;
*ptr = *read_ptr++; return ;
} int main(int argc, char *argv[])
{
int fd;
int band_rate;
int uart_init_interval_second;
char *dev; int cnt = -, i = ;
unsigned char recv_buff[] = { };
char c; if( != argc)
{
printf("Usage: %s <rs232_dev> <band_rate> <uart_init_interval_second>\n", argv[]);
return -;
} dev = (char *)argv[];
band_rate = atoi((char *)argv[]);
uart_init_interval_second = atoi((char *)argv[]);
/*
if((fd = open_dev(dev)) < 0)
{
printf("can't open port %s \n", dev);
return -1;
} */
if((fd = open_dev(dev)) < )
{
printf("can't open port %s \n", dev);
return -;
}
else
{
if(set_speci_baud(fd, band_rate) < )
//if(set_speci_baud(fd, 500000) < 0)
{
printf("Set Speed Error set_speci_baud: %d\n",band_rate);
close(fd);
return -;
} sleep(uart_init_interval_second);
// if(set_speed(fd, 115200) < 0)
// {
// printf("Set Speed Error set_speed\n");
// return -1;
// } if(set_parity(fd, , , 'N') < )
{
printf("Set Parity Error\n");
close(fd);
return -;
}
sleep(uart_init_interval_second);
} while(){
if( == Read1(fd, &c))
{
fprintf(stderr, "c[%c] = 0x%02x \n", c, (unsigned char)c);
}
} close(fd); return ;
}
Non-standard serial port baud rate setting的更多相关文章
- ROS 进阶学习笔记(12) - Communication with ROS through USART Serial Port
Communication with ROS through USART Serial Port We always need to communicate with ROS through seri ...
- I.MX6 Linux Serial Baud Rate hacking
/******************************************************************************** * I.MX6 Linux Seri ...
- Serial Port Programming using Win32 API(转载)
In this tutorial we will learn How to communicate with an external device like a microcontroller boa ...
- Serial Port Programming on Linux(转载)
This is a tutorial on how to program the Serial Ports on your Linux box.Serial Ports are nice little ...
- select/poll/epoll on serial port
In this article, I will use three asynchronous conferencing--select, poll and epoll on serial port t ...
- CANBus Determining Network Baud Rate, Automatic bit-rate detection
http://www.canbushack.com/blog/index.php?title=determining-network-baud-rate Determining Network Bau ...
- [转]How Can I Find Out What Is Using a Busy or Reserved Serial Port?
转自:http://digital.ni.com/public.nsf/allkb/29B079481C5ECE76862578810082394E How Can I Find Out What I ...
- 串口总是报'Error opening serial port'
Comm1.CommName := '//./' + Trim(combx_Port.Text); 目前串口大于20 用上面方法解决的 网上也有上面方法解决如下错误的. 若是您已会应用SPCOMM且 ...
- Unable to open serial port /dev/ttyUSB0
ubuntu12.04使用USB转串口时出现权限不够问题,如下 Unable to open serial port /dev/ttyUSB0 权限不够 解决办法: 通过增加udev规则来实现.步骤如 ...
随机推荐
- 剑指offer19:按照从外向里以顺时针的顺序依次打印出每一个数字,4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
1 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印 ...
- python--基本语法与变量
python基本语法与变量 python语句的缩进 Python代码块使用缩进对齐表示代码逻辑,Python每段代码块缩进的空白数量可以任意,但要确保同段代码块语句必须包含相同的缩进空白数量.建议在代 ...
- python — 装饰器、迭代器
目录 1 装饰器 2 迭代器 3 可迭代对象 1 装饰器 1.1目的.应用场景: 目的: 在不改变原函数内部代码的基础上,在函数执行前后自定义功能. 应用场景: 想要为函数扩展功能时,可以选择用装饰器 ...
- KeyValuePair<string, string>
; #region CUP Method /// <summary> /// 请求与响应的超时时间 /// </summary> static public int Timeo ...
- 常用bat文件
rmLog.bat @echo offpause >nul | echo 按任意键继续3pause >nul | echo 按任意键继续2pause >nul | echo 按任意键 ...
- WindowsAPI使用详解——GetVersion|GetVersionEx 获取操作系统版本和名称
Windows API 中有两个函数可以得到系统版本信息:GetVersion和GetVersionEx. GetVersion这个函数曾经困扰了很多程序员,其本来设计的是在DWORD返 ...
- MVC部分视图的使用(Html.Partial/RenderPartial、Html.Action/RenderAction、RenderPage)
ASP.NET MVC 里页面往往会有许多重用的地方,可以进行封装重用. 使用部分视图有以下优点: 1. 可以简写代码. 2. 页面代码更加清晰.更好维护. 在视图里有多种方法可以 加载部分视图,包括 ...
- c# winform找窗体
Application.OpenForms["frm"],一句话就找到窗体
- VBA学习资料分享-5
工作中经常要从数据库把数据跑出来放到EXCEL上,才能进行下一步的操作,那么除了ADO,还有什么方法可以导入数据库数据呢? 推荐使用QueryTable对象 Dim qt As querytable ...
- JS基础_实参可以是任何值
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...