////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的更多相关文章

  1. 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 ...

  2. I.MX6 Linux Serial Baud Rate hacking

    /******************************************************************************** * I.MX6 Linux Seri ...

  3. Serial Port Programming using Win32 API(转载)

    In this tutorial we will learn How to communicate with an external device like a microcontroller boa ...

  4. 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 ...

  5. select/poll/epoll on serial port

    In this article, I will use three asynchronous conferencing--select, poll and epoll on serial port t ...

  6. CANBus Determining Network Baud Rate, Automatic bit-rate detection

    http://www.canbushack.com/blog/index.php?title=determining-network-baud-rate Determining Network Bau ...

  7. [转]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 ...

  8. 串口总是报'Error opening serial port'

    Comm1.CommName := '//./' + Trim(combx_Port.Text); 目前串口大于20  用上面方法解决的 网上也有上面方法解决如下错误的. 若是您已会应用SPCOMM且 ...

  9. Unable to open serial port /dev/ttyUSB0

    ubuntu12.04使用USB转串口时出现权限不够问题,如下 Unable to open serial port /dev/ttyUSB0 权限不够 解决办法: 通过增加udev规则来实现.步骤如 ...

随机推荐

  1. 剑指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 则依次打印 ...

  2. python--基本语法与变量

    python基本语法与变量 python语句的缩进 Python代码块使用缩进对齐表示代码逻辑,Python每段代码块缩进的空白数量可以任意,但要确保同段代码块语句必须包含相同的缩进空白数量.建议在代 ...

  3. python — 装饰器、迭代器

    目录 1 装饰器 2 迭代器 3 可迭代对象 1 装饰器 1.1目的.应用场景: 目的: 在不改变原函数内部代码的基础上,在函数执行前后自定义功能. 应用场景: 想要为函数扩展功能时,可以选择用装饰器 ...

  4. KeyValuePair<string, string>

    ; #region CUP Method /// <summary> /// 请求与响应的超时时间 /// </summary> static public int Timeo ...

  5. 常用bat文件

    rmLog.bat @echo offpause >nul | echo 按任意键继续3pause >nul | echo 按任意键继续2pause >nul | echo 按任意键 ...

  6. WindowsAPI使用详解——GetVersion|GetVersionEx 获取操作系统版本和名称

      Windows API 中有两个函数可以得到系统版本信息:GetVersion和GetVersionEx.      GetVersion这个函数曾经困扰了很多程序员,其本来设计的是在DWORD返 ...

  7. MVC部分视图的使用(Html.Partial/RenderPartial、Html.Action/RenderAction、RenderPage)

    ASP.NET MVC 里页面往往会有许多重用的地方,可以进行封装重用. 使用部分视图有以下优点: 1. 可以简写代码. 2. 页面代码更加清晰.更好维护. 在视图里有多种方法可以 加载部分视图,包括 ...

  8. c# winform找窗体

    Application.OpenForms["frm"],一句话就找到窗体

  9. VBA学习资料分享-5

    工作中经常要从数据库把数据跑出来放到EXCEL上,才能进行下一步的操作,那么除了ADO,还有什么方法可以导入数据库数据呢? 推荐使用QueryTable对象 Dim qt As querytable ...

  10. JS基础_实参可以是任何值

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...