////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. WPF 位图处理相关类

    位图的存储方式 开始之前,先了解下位图的存储方式 位图的像素都分配有特定的位置和颜色值.每个像素的颜色信息由RGB组合或者灰度值表示,根据位深度,可将位图分为1.4.8.16.24及32位图像等.每个 ...

  2. java统计字符串中每个字符出现的次数

    package MapTest; import java.util.HashMap; public class MapTest { public static void Count(String st ...

  3. MyBatis 源码篇-Transaction

    本章简单介绍一下 MyBatis 的事务模块,这块内容比较简单,主要为后面介绍 mybatis-spring-1.**.jar(MyBatis 与 Spring 集成)中的事务模块做准备. 类图结构 ...

  4. 怎样查看Nginx版本号

    方法一: 使用 nginx -v nginx -v 方法二: 使用 nginx -V nginx -V 注意: nginx -V 显示的是: 版本号 / 编译器版本 / 配置参数

  5. python+django学习三

    在这个网站看https://sshwsfc.github.io/xadmin/     xadmin结果一堆的坑,文档找不到界面,dome登陆就报错permission denied for rela ...

  6. luogu4677山区建小学题解--区间DP

    题目链接 https://www.luogu.org/problemnew/show/P4677 分析 这道题方法跟之前题不一样,我们相当于枚举一个左右端点来线性扩展,同时划分断点进行决策 \(f[i ...

  7. JSON格式互转集合 (2)

    public class JSON { public static string DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss"; ...

  8. script标签所应放的位置

    一般放置的位置:<head>标签内,<body>标签内,<body>标签后(建议放在body标签后,利于页面的优化,优化页面结构加载的速度) 1.<head& ...

  9. Linux 硬盘UUID相同处理方法

    OVF模板部署的linux虚拟机磁盘id是相同的,当同一个模板生成的虚拟机挂载虚拟机磁盘时就会遇到两个磁盘UUID相同的情况,导致系统启动后只能识别一个磁盘.这里介绍一下LVM分区的磁盘UUID相同的 ...

  10. idHTTP.Post

    procedure TForm4.Button2Click(Sender: TObject); var sResponse: string; EnvStr : TStringStream; begin ...