LINUX串口源代码
linux串口编程参数配置详解
linux串口编程参数配置详解1.linux串口编程需要的头文件#include <stdio.h> //标准输入输出定义#include <stdlib.h> //标准函数库定义#include <unistd.h> //Unix标准函数定义#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> //文件控制定义#include <termios.h> //POSIX中断控制定义#include <errno.h> //错误号定义2.打开串口串口位于/dev中,可作为标准文件的形式打开,其中:串口1 /dev/ttyS0串口2 /dev/ttyS1代码如下:int fd;fd = open(“/dev/ttyS0”, O_RDWR);if(fd == -1){Perror(“串口1打开失败!”);}//else//fcntl(fd, F_SETFL, FNDELAY);除了使用O_RDWR标志之外,通常还会使用O_NOCTTY和O_NDELAY这两个标志。
O_NOCTTY:告诉Unix这个程序不想成为“控制终端”控制的程序,不说明这个标志的话,任何输入都会影响你的程序。
O_NDELAY:告诉Unix这个程序不关心DCD信号线状态,即其他端口是否运行,不说明这个标志的话,该程序就会在DCD信号线为低电平时停止。
3.设置波特率最基本的串口设置包括波特率、校验位和停止位设置,且串口设置主要使用termios.h头文件中定义的termios结构,如下:struct termios{tcflag_t c_iflag; //输入模式标志tcflag_t c_oflag; //输出模式标志tcflag_t c_cflag; //控制模式标志tcflag_t c_lflag; //本地模式标志cc_t c_line; //line disciplinecc_t c_cc[NCC]; //control characters}代码如下:int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B384 00, B19200, B9600, B4800, B2400, B1200, B300, };int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9 600, 4800, 2400, 1200, 300, };void SetSpeed(int fd, int speed){int i;struct termios Opt; //定义termios结构if(tcgetattr(fd, &Opt) != 0){perror(“tcgetattr fd”);return;}for(i = 0; i < sizeof(speed_arr) / sizeof(int); i++){if(speed == name_arr[i]){tcflush(fd, TCIOFLUSH);cfsetispeed(&Opt, speed_arr[i]);cfsetospeed(&Opt, speed_arr[i]);if(tcsetattr(fd, TCSANOW, &Opt) != 0){perror(“tcsetattr fd”);return;}tcflush(fd, TCIOFLUSH);}}}注意tcsetattr函数中使用的标志:TCSANOW:立即执行而不等待数据发送或者接受完成。
编译 linux 源代码
编译linux 源代码
编译 Linux 源代码需要以下步骤:
1.下载 Linux 源代码
可以从官方网站或者其它可靠的源下载 Linux 源代码。
2.解压源代码
使用解压工具将下载的源代码解压到一个目录下。
3.配置编译环境
在终端中输入以下命令来配置编译环境:
bash复制代码
export ARCH=arm64 # 根据自己的硬件架构选择合适的架构
export CROSS_COMPILE=arm64-linux-gnueabi- # 根据自己的硬件架构选择合适的编译器前缀
4.执行编译命令
在终端中输入以下命令来执行编译:
bash复制代码
make menuconfig # 配置内核选项,按上下键选择需要的选项,按空格键进行确认/取消选择,按Y 键保存更改,最后按 Esc 键退出配置菜单。
make # 开始编译内核,等待编译完成。
5.等待编译完成
编译完成后,会在arch/$ARCH/boot/目录下生成一个名为Image的文件,这就是编译好的 Linux 内核映像文件。
嵌入式linux串口应用程序编写流程
嵌入式linux串口应用程序编写流程嵌入式Linux系统提供了丰富的串口接口,可以通过串口与其他设备进行通信,这为开发嵌入式系统提供了很多可能性。
下面是编写嵌入式Linux串口应用程序的流程:1. 确定串口设备:首先要确定要使用的串口设备,可以使用命令`ls /dev/tty*`来查看系统中可用的串口设备列表。
根据需要选择合适的串口设备。
2. 打开串口设备:在Linux系统中,使用文件的方式来操作串口设备。
可以使用C语言中的open函数来打开串口设备文件,并返回串口设备的文件描述符。
例如:`int serial_fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);`。
其中,`O_RDWR`表示以读写模式打开串口设备,`O_NOCTTY`表示打开设备后不会成为该进程的控制终端,`O_NDELAY`表示非阻塞模式。
3. 配置串口参数:打开串口设备后,需要配置串口参数,包括波特率、数据位、停止位、校验位等。
可以使用C语言中的termios库来进行串口参数的配置。
例如:```cstruct termios serial_config;tcgetattr(serial_fd, &serial_config);cfsetispeed(&serial_config, B115200);cfsetospeed(&serial_config, B115200);serial_config.c_cflag |= CS8;serial_config.c_cflag &= ~PARENB;serial_config.c_cflag &= ~CSTOPB;tcsetattr(serial_fd, TCSANOW, &serial_config);```上述代码将波特率设置为115200,数据位设置为8位,无校验位,一个停止位。
FreeModBus代码分析(Linux、RTU)
FreeModBus在Linux/RTU模式下的代码分析2013年12月3号1、程序从demo/linux/Demo.c中的main()函数开始执行,if( !bSetSignal( SIGQUIT, vSigShutdown ) ||!bSetSignal( SIGINT, vSigShutdown ) || !bSetSignal( SIGTERM, vSigShutdown ) ),有点像是在测试信号处理函数。
2、串口初始化,eMBInit( MB_RTU, 0x0A, 0, 38400, MB_PAR_EVEN ),首先判断从设备地址,是否是广播或者是否合法,if( ( ucSlaveAddress == MB_ADDRESS_BROADCAST ) ||( ucSlaveAddress < MB_ADDRESS_MIN ) || ( ucSlaveAddress > MB_ADDRESS_MAX ) ),如果非法,则eState置为MB_EINV AL,否则ucMBAddress = ucSlaveAddress;根据传入参数eMode判断工作模式为MB_RTU,将相应的函数指针指向该模式下的函数,如pvMBFrameStartCur = eMBRTUStart;调用eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity )完成串口初始化并将初始化过程中的eStatus变化返回,xMBPortSerialInit( ucPort, ulBaudRate, 8, eParity )设置串口通信参数,根据波特率设置T35时间,并初始化超时定时器xMBPortTimersInit( ( USHORT ) usTimerT35_50us );判断if( eStatus == MB_ENOERR ),即错误码是否为NO ERROR状态,调用xMBPortEventInit( ),初始化事件队列,xEventInQueue 设置为FALSE。
Linux串口通信编程
2) 设置属性:奇偶校验位、数据位、停止位。
主要设置<termbits.h>中的termios3) 打开、关闭和读写串口。
串口作为设备文件,可以直接用文件描述符来进行网上的一个例子:/*串口设备无论是在工控领域,还是在嵌入式设备领域,应用都非常广泛。
而串口编程也就显得必不可少。
偶然的一次机会,需要使用串口,而且操作系统还要求是Linux,因此,趁着这次机会,综合别人的代码,进行了一次整理和封装。
具体的封装格式为C代码,这样做是为了很好的移植性,使它可以在C和C++环境下,都可以编译和使用。
代码的头文件如下: *//////////////////////////////////////////////////////////////////// //////////////filename:stty.h#ifndef__STTY_H__#define__STTY_H__//包含头文件#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<termios.h>#include<errno.h>#include<pthread.h>//// 串口设备信息结构typedef struct tty_info_t{int fd;// 串口设备IDpthread_mutex_t mt;// 线程同步互斥对象char name[24];// 串口设备名称,例:"/dev/ttyS0"struct termios ntm;// 新的串口设备选项struct termios otm;// 旧的串口设备选项}TTY_INFO;//// 串口操作函数TTY_INFO *readyTTY(int id);int setTTYSpeed(TTY_INFO *ptty,int speed);int setTTYParity(TTY_INFO *ptty,int databits,int parity,int st opbits);int cleanTTY(TTY_INFO *ptty);int sendnTTY(TTY_INFO *ptty,char*pbuf,int size);int recvnTTY(TTY_INFO *ptty,char*pbuf,int size);int lockTTY(TTY_INFO *ptty);int unlockTTY(TTY_INFO *ptty);#endif/*从头文件中的函数定义不难看出,函数的功能,使用过程如下:(1)打开串口设备,调用函数setTTYSpeed();(2)设置串口读写的波特率,调用函数setTTYSpeed();(3)设置串口的属性,包括停止位、校验位、数据位等,调用函数setTTYParity ();(4)向串口写入数据,调用函数sendnTTY();(5)从串口读出数据,调用函数recvnTTY();(6)操作完成后,需要调用函数cleanTTY()来释放申请的串口信息接口;其中,lockTTY()和unlockTTY()是为了能够在多线程中使用。
linux设备驱动,tty串口编程
linux设备驱动,tty串口编程2011-12-04 08:56:33分类:LINUXXC2440开发板上已经含有S3C2440的3个串口驱动,我们只要知道各个串口的设备名称就可以了,204 s3c2410_serial ,204是串口的主设备号。
s3c2410_serial是设备名称,在 dev目录下 ls 一下就可以发现ptyd0 s3c2410_serial0 ttysaptyd1 s3c2410_serial1 ttysbptyd2 s3c2410_serial2 ttyscs3c2410_serial0,s3c2410_serial1,s3c2410_serial2 分别是串口1、2、3的设备名称下面是测试源码,打开串口1、2,程序执行后,串口1的波特率变为9600,这时候你的串口终端就没有反应了(串口1波特率默认115200),把终端软件串口1 波特率改为9600后,连接终端,回车一下,然后输入几个‘1’后,画面如上图。
这时用telnet工具登陆开发板,执行ps 查看现有运行的程序,找到tty [root@XC2440 /root]# psPID USER TIME COMMAND1 root 0:04 init2 root 0:00 [kthreadd]3 root 0:00 [ksoftirqd/0]5 root 0:00 [kworker/u:0]6 root 0:00 [khelper]7 root 0:00 [kworker/u:1]10 root 0:00 [netns]236 root 0:00 [sync_supers]238 root 0:00 [bdi-default]240 root 0:00 [kblockd]249 root 0:00 [khubd]252 root 0:00 [kseriod]258 root 0:00 [kmmcd]347 root 0:00 [rpciod]349 root 0:00 [kworker/0:1]355 root 0:00 [kswapd0]356 root 0:00 [aio]357 root 0:00 [nfsiod]358 root 0:00 [crypto]901 root 0:00 [mtdblock0]906 root 0:00 [mtdblock1]911 root 0:00 [mtdblock2]916 root 0:00 [mtdblock3]1028 root 0:00 [usbhid_resumer]1049 root 0:00 [yaffs-bg-1]1060 root 0:00 vsftpd /etc/vsftpd.conf1065 root 0:00 -/bin/sh1067 root 0:00 /usr/sbin/telnetd -l /bin/login1070 root 0:18 /usr/local/qtopia/bin/qpe -qws1071 root 0:00 boa1072 root 0:00 [kworker/0:2]1085 root 0:02 /usr/local/qtopia/bin/quicklauncher1086 root 0:00 /usr/local/qtopia/bin/qss1089 root 0:02 /usr/local/qtopia/bin/quicklauncher1098 root 0:00 [flush-31:3]1100 root 0:00 ./tty1101 root 0:00 -ash1104 root 0:00 ps[root@XC2440 /root]# kill 1100执行 kill 1100 后tty测试程序就被终止了,这时串口终端就可以用了,回车一下Terminated[@XC2440 pub]#Please press Enter to activate this console.Processing /etc/profile...Done[root@XC2440 /]#[root@XC2440 /]#测试代码如下:#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/types.h>#include <errno.h>#include <termios.h>#include <sys/time.h>#include <signal.h>#include <string.h>#include <fcntl.h>#include <asm/param.h>#include "pthread.h"//#include "serial_set.h"/******************************************************************* * 函数名称: set_opt* 功能描述:设置串口基本参数* 输入参数: fd 打开的串口标识符(通过open_port函数返回)nSpeed 波特率 2400、4800、9600、115200nBits 数据位 7、8nEvent 奇偶校验 'O' 'N' 'E'nStop 停止位 1、2* 输出参数:无* 返回值: 0 设置成功-1 设置过程出错* 其它说明:无* 修改日期版本号修改人修改内容*-------------------------------------------------------------------- * 2010/09/27 V1.0 *** 创建函数***********************************************************************/int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop) {struct termios newtio,oldtio;//保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息if ( tcgetattr( fd,&oldtio) != 0){perror("SetupSerial 1");return -1;}//extern void bzero(void *s, int n); 置字节字符串s的前n个字节为零bzero( &newtio, sizeof( newtio ) );//设置字符大小newtio.c_cflag |= CLOCAL | CREAD;newtio.c_cflag &= ~CSIZE;//设置数据位switch( nBits ){case 7:newtio.c_cflag |= CS7;break;case 8:newtio.c_cflag |= CS8;break;}//设置校验位switch( nEvent ){case 'O':newtio.c_cflag |= PARENB;newtio.c_cflag |= PARODD;newtio.c_iflag |= (INPCK | ISTRIP);break;case 'E':newtio.c_iflag |= (INPCK | ISTRIP);newtio.c_cflag &= ~PARODD; break;case 'N':newtio.c_cflag &= ~PARENB; break;}//设置波特率switch( nSpeed ){case 2400:cfsetispeed(&newtio, B2400); cfsetospeed(&newtio, B2400); break;case 4800:cfsetispeed(&newtio, B4800); cfsetospeed(&newtio, B4800); break;case 9600:cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); break;case 115200:cfsetispeed(&newtio, B115200); cfsetospeed(&newtio, B115200); break;default:cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); break;}//设置停止位if( nStop == 1 )newtio.c_cflag &= ~CSTOPB; else if ( nStop == 2 )//设置等待时间和最小接收字符newtio.c_cc[VTIME] = 0;newtio.c_cc[VMIN] = 0;//处理未接收字符tcflush(fd,TCIFLUSH);//激活新配置if((tcsetattr(fd,TCSANOW,&newtio))!=0){perror("com set error");//打印com set error及出错原因return -1;}printf("set done!\n");return 0;}/******************************************************************** *** 函数名称: open_port* 功能描述:打开指定串口* 输入参数: fd 文件描述符comport 串口号(1、2、3)* 输出参数:无* 返回值:出错返回 -1成功返回 fd文件描述符* 其它说明:无* 修改日期版本号修改人修改内容*-------------------------------------------------------------------- * 2010/09/27 V1.0 *** 创建函数********************************************************************* **//*static struct uart_driver s3c24xx_uart_drv = {.owner = THIS_MODULE,.dev_name = "s3c2410_serial",.nr = CONFIG_SERIAL_SAMSUNG_UARTS,.cons = S3C24XX_SERIAL_CONSOLE,.driver_name = S3C24XX_SERIAL_NAME,.major = S3C24XX_SERIAL_MAJOR,.minor = S3C24XX_SERIAL_MINOR,};*/int open_port(int fd,int comport){//char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"}; long vdisable;//没用//打开串口if (comport==1){//fd = open("/dev/ttySAC0",O_RDWR|O_NOCTTY|O_NDELAY);fd = open("/dev/s3c2410_serial0",O_RDWR|O_NOCTTY|O_NDELAY); if (-1 == fd){perror("Can't Open s3c2410_serial0");return(-1);}elseprintf("open s3c2410_serial0 .....\n");}else if(comport==2){fd = open("/dev/s3c2410_serial1",O_RDWR|O_NOCTTY|O_NDELAY); if (-1 == fd){perror("Can't Open s3c2410_serial1");return(-1);}elseprintf("open s3c2410_serial1 .....\n");}else if (comport==3){fd = open("/dev/s3c2410_serial2",O_RDWR|O_NOCTTY|O_NDELAY);if (-1 == fd){perror("Can't Open s3c2410_serial2");return(-1);}elseprintf("open s3c2410_serial2 .....\n");}else if (comport==4){fd = open("/dev/s3c2410_serial3",O_RDWR|O_NOCTTY|O_NDELAY);if (-1 == fd){perror("Can't Open s3c2410_serial3");return(-1);}elseprintf("open s3c2410_serial3 .....\n");}//恢复串口的状态为阻塞状态,用于等待串口数据的读入if(fcntl(fd, F_SETFL, 0) < 0)printf("fcntl failed!\n");elseprintf("fcntl=%d\n",fcntl(fd, F_SETFL,0));//测试打开的文件描述符是否引用一个终端设备,以进一步确认串口是否正确打开if(isatty(STDIN_FILENO)==0)printf("standard input is not a terminal device\n");elseprintf("isatty success!\n");printf("fd-open=%d\n",fd);return fd;}unsigned int val=0;int main(int argc, char **argv){long ret=0;int receNum=0,receFlag=0;unsigned char ReceBuf[512],SendBuf[512];int fd,fdd;int nread,i;unsigned char buff[512];struct timeval timeout;bzero(buff, 512);if((fdd=open_port(fdd,2)) < 0)//打开串口 2{printf("open_port error2\n");return -1;}if((i=set_opt(fdd,9600,8,'N',1)) < 0)//设置串口 9600 8 N 1 {printf("set_opt error2\n");return -1;}printf("fd=%d\n",fdd);if((fd=open_port(fd,1)) < 0)//打开串口 1{printf("open_port error1\n");return -1;}if((i=set_opt(fd,9600,8,'N',1)) < 0)//设置串口 9600 8 N 1 {printf("set_opt error1\n");return -1;}printf("fd=%d\n",fd);_sec=1;//设置定时器_usec=0;while (1){nread = read(fd,buff,256);//读串口数据非阻塞if(nread>0){memcpy(&ReceBuf[receNum],buff,nread);receFlag=2;receNum +=nread; if(receNum>511)receNum=0;printf("nread = %d\n",nread);printf("%s\n",buff);bzero(buff,nread);//清空}else{//printf("main\n");if(receFlag>1)receFlag--;if(receFlag==1){write(fd,ReceBuf,receNum);//写数据receNum=0;receFlag=0;}_sec=0;_usec=20000;//设置时间 20MS 读取一下串口数据ret=select(0,NULL,NULL,NULL,&timeout);}}close(fdd);close(fd);return 0;}。
教你用串口终端作为Linux系统控制台
教你用串口终端作为Linux系统控制台展开全文教你用串口终端作为Linux系统控制台利用串口终端作为Linux控制台,可以免去额外的键盘,显示卡和显示器,同时可将Linux主机作为一个任意用途的嵌入式黑匣。
将串口终端连接到计算机的串口上并不困难,可以参考Linux的HOWTO文档和以及inittab和agetty的帮助信息。
这里扼要地说一下。
首先,准备好一根null modem 电缆。
其次,在文件/etc/inittab 增加下面一行。
[注:如果你不采用agetty程序,采用其他的程序如like getty_ps ,应用正确的命令语法] ID:RUNLEVELS:respawn:/sbin/agetty -L SPEED TTY TERM这里: ID =两字母的标识符,如s1或s2。
RUNLEVELS = 终端激活的运行级别。
SPEED = 串口端口速率。
TTY = 串口的设备名。
TERM = TERM环境变量。
范例如下:s2:12345:respawn:/sbin/agetty -L 9600 ttyS1 vt100表示串口/dev/ttyS1 (COM2 )速率为9600 bps,终端模式为vt100。
最后,重新启动机器。
如正确地按照上述三步进行,则就可以在终端屏幕上出现Login: 的提示符。
你可以登录进系统,并能象在实际的控制台上或从远程Telnet登录一样进行工作。
下面简单介绍一下如何终端设置成控制台,主要涉及内核信息、启动脚本信息和LILO信息。
一、内核信息系统在启动时显示的信息总是输出到主控制台(tty1)。
打开机器后,你只有等待Login: 出现在终端屏幕上,这意味着所有启动信息都无法获悉。
你只有登录后用dmesg命令查看,但通常是想在login shell起来前看到这些信息。
还有其他信息出现在控制台上:/etc/rc.d目录下脚本命令执行时,启动和终止机器时运行的脚本命令等输出的信息。
Linux_C_C++串口读写串口读写
Linux C/C++串口读写串口简介串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。
常用的串口是RS-232-C 接口(又称EIA RS-232-C)它是在1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。
它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个25 个脚的DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。
传输距离在码元畸变小于4% 的情况下,传输电缆长度应为50 英尺。
Linux 操作系统从一开始就对串行口提供了很好的支持串口操作打开串口在Linux 下串口文件是位于/dev 下的串口一为/dev/ttyS0串口二为/dev/ttyS1设置串口最基本的设置串口包括波特率设置,效验位和停止位设置。
设置这个结构体很复杂,我这里就只说说常见的一些设置:波特率设置设置波特率的例子函数:/***@brief 设置串口通信速率*@param fd 类型 int 打开串口的文件句柄*@param speed 类型 int 串口速度*@return void*/int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,B38400, B19200, B9600, B4800, B2400,B1200, B300, };int name_arr[] ={38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, }; void set_speed(int fd, int speed){int i;int status;struct termios Opt;tcgetattr(fd, &Opt);for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {if (speed == name_arr[i]) {/*** tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送)。
linux设备驱动之8250串口驱动
linux设备驱动之8250串口驱动一:前言前一段时间自己实践了一下8250芯片串口驱动的编写。
今天就在此基础上分析一下linux kernel自带的串口驱动。
毕竟只有对比专业的驱动代码才能更好的进步,同以往一样,基于linix kernel2.6.25.相应驱动代码位于:linux-2.6.25/drivers/serial/8250.c。
二:8250串口驱动初始化相应的初始化函数为serial8250_init().代码如下:static int __init serial8250_init(void){int ret, i;if (nr_uarts > UART_NR)nr_uarts = UART_NR;printk(KERN_INFO "Serial: 8250/16550 driver $Revision: 1.90 $ ""%d ports, IRQ sharing %sabled\n", nr_uarts,share_irqs ? "en" : "dis");for (i = 0; i < NR_IRQS; i++)spin_lock_init(&irq_lists[i].lock);ret = uart_register_driver(&serial8250_reg);if (ret)goto out;serial8250_isa_devs = platform_device_alloc("serial8250",PLAT8250_DEV_LEGACY);if (!serial8250_isa_devs) {ret = -ENOMEM;goto unreg_uart_drv;}ret = platform_device_add(serial8250_isa_devs);if (ret)goto put_dev;serial8250_register_ports(&serial8250_reg, &serial8250_isa_devs->dev);ret = platform_driver_register(&serial8250_isa_driver);if (ret == 0)goto out;platform_device_del(serial8250_isa_devs);put_dev:platform_device_put(serial8250_isa_devs);unreg_uart_drv:uart_unregister_driver(&serial8250_reg);out:return ret;}这段代码涉及到的知识要求,如platform ,uart等我们在之前都已经做过详细的分析。
linux查串口号
linux查串口号
在Linux系统中,可以通过以下几种方法来查找串口号:
1. 使用命令行工具,打开终端,输入命令`ls /dev/tty`,系
统会列出所有的串口设备。
通常,串口设备以`/dev/ttyS`或
`/dev/ttyUSB`开头,后面跟着一个数字,表示串口号。
2. 使用dmesg命令,打开终端,输入命令`dmesg | grep tty`,系统会显示与串口相关的信息,包括串口设备的名称和对应的串口号。
3. 查看udev规则,udev是Linux系统中的设备管理框架,可
以通过查看udev规则来获取串口设备的信息。
打开终端,输入命令
`ls /etc/udev/rules.d/`,系统会列出udev规则文件的列表。
查
找以`99-com.rules`或类似命名的文件,使用文本编辑器打开该文件,搜索关键词`tty`,可以找到与串口设备相关的规则和信息。
4. 查看/sys目录,打开终端,输入命令`ls
/sys/class/tty/`,系统会显示所有的tty设备。
在这个目录下,
可以找到与串口设备相关的信息,包括串口号。
需要注意的是,以上方法可能需要root权限才能执行。
此外,
如果你已经连接了串口设备,可以通过观察设备文件的创建和删除
来确定串口号的变化。
希望以上信息能够帮助你找到所需的串口号。
Linux C 串口编程
Linux C 串口编程arch/arm/include/asm/termbits.hstruct termios {tcflag_t c_iflag; /* input mode flags */tcflag_t c_oflag; /* output mode flags */tcflag_t c_cflag; /* control mode flags */tcflag_t c_lflag; /* local mode flags */cc_t c_line; /* line discipline */cc_t c_cc[NCCS]; /* control characters */ };串口的设置主要是设置struct termios结构体的各成员/***测试的时候应用程序在后台运行./serial_test &*/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> //文件控制定义#include <termios.h>//终端控制定义#include <errno.h>#define DEVICE "/dev/s3c2410_serial0"int serial_fd = 0;//打开串口并初始化设置init_serial(void){serial_fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);if (serial_fd < 0) {perror("open");return -1;}//串口主要设置结构体termios <termios.h>struct termios options;/**1. tcgetattr函数用于获取与终端相关的参数。
linux c语言串口非标准波特率
linux c语言串口非标准波特率在Linux系统中,使用C语言进行串口通信是一种常见的操作。
通常情况下,串口的波特率可以设置为标准的数值,例如9600、115200等。
但是有时候我们也会遇到一些特殊的情况,需要使用非标准的波特率。
本文将介绍如何在Linux系统中使用C语言进行串口通信,并设置非标准的波特率。
首先,我们需要包含一些头文件,以便在程序中使用串口相关的函数。
我们可以使用以下代码来包含这些头文件:```#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <termios.h>#include <unistd.h>```接下来,我们需要打开串口设备。
使用open()函数可以打开串口设备。
```cint fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);if (fd < 0) {perror("Error opening serial port");return -1;}```在上述代码中,我们使用了"/dev/ttyS0"作为串口设备的文件路径。
根据实际情况,你可能需要使用其他的路径,比如"/dev/ttyUSB0"等。
接下来,我们需要配置串口的波特率。
我们可以使用termios结构体,并使用tcgetattr()函数和tcsetattr()函数来设置波特率。
```cstruct termios options;tcgetattr(fd, &options);cfsetispeed(&options, B57600);cfsetospeed(&options, B57600);tcsetattr(fd, TCSANOW, &options);```在上述代码中,我们将波特率设置为57600。
linux c语言编写modbus rtu例程 -回复
linux c语言编写modbus rtu例程-回复如何使用C语言在Linux下编写Modbus RTU例程,以实现数据的读取和写入。
Modbus是一种通信协议,用于在工业自动化系统中实现设备之间的数据通信。
RTU是Modbus协议的一种传输格式,其中数据以二进制形式传输。
在Linux系统中,我们可以使用C语言来编写Modbus RTU例程。
下面将一步一步回答如何实现数据的读取和写入。
第一步:设置串口参数在Linux中,我们可以使用串口来与Modbus设备进行通信。
首先,我们需要设置串口的波特率、数据位、停止位和校验位。
这可以通过C语言中的termios库函数来实现。
c#include <termios.h>int set_serial_port(int fd, int baudrate) {struct termios options;tcgetattr(fd, &options);cfsetispeed(&options, baudrate);cfsetospeed(&options, baudrate);options.c_cflag = (CLOCAL CREAD);options.c_cflag &= ~CSIZE;options.c_cflag = CS8;options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;options.c_cflag &= ~CRTSCTS;tcsetattr(fd, TCSANOW, &options);}以上代码中,`set_serial_port`函数用于设置串口参数。
`fd`参数为串口文件描述符,`baudrate`参数为波特率。
其中,`cfsetispeed`和`cfsetospeed`函数用于设置输入和输出速度,`CLOCAL`和`CREAD`标志用于使串口工作在本地模式和可读模式,`CS8`标志用于设置8位数据位,`PARENB`标志用于禁用奇偶校验,`CSTOPB`标志用于设置停止位为1位,`CRTSCTS`标志用于禁用硬件流控制。
linux下串口设备命名规则
linux下串口设备命名规则在Linux操作系统中,串口设备的命名规则是由udev(设备节点管理器)动态分配的,其规则是基于设备的物理路径和设备类别。
Linux系统中的串口设备通常以TTY(teletypewriter)开头命名,具体命名规则如下:1. TTY设备命名规则在Linux系统中,串口设备通常命名为/dev/ttyS[0-3]和/dev/ttyUSB[0-3]。
其中,ttyS表示在主板上的串口设备,ttyUSB表示使用USB转串口适配器的设备。
[0-3]表示可用的串口设备数量,可以根据系统硬件配置的不同而有所变动。
2.物理路径规则串口设备的命名规则还与设备所连接的物理接口有关。
每个串口设备都会在/dev目录下创建一个设备节点。
例如,串口1(第一个串口)会创建/dev/ttyS0设备节点,串口2(第二个串口)会创建/dev/ttyS1设备节点,以此类推。
对于使用USB转串口适配器连接的设备,udev会根据USB总线和端口的信息进行命名。
例如,如果一个USB转串口适配器插入到了USB2.0总线上的第1个端口,那么它将被命名为/dev/ttyUSB0设备节点。
3.设备类别规则Linux系统将串口设备分为两个类别:主板上的物理串口设备和通过USB转串口适配器连接的设备。
主板上的物理串口设备包括集成在主板上的串口接口,这些接口通常标记为COM1、COM2等。
通过USB转串口适配器连接的设备需要通过udev进行识别和命名。
4. udev规则udev是Linux系统中的设备节点管理器,通过udev规则可以定制设备的命名和属性等。
udev规则通常存储在/etc/udev/rules.d目录下的文件中。
在udev规则中,可以根据设备的属性(例如设备的Vendor ID和Product ID)对设备进行过滤,从而指定设备的命名规则。
例如,可以通过以下udev规则将某个Vendor ID和Product ID 的设备命名为/dev/my_serial_device:```SUBSYSTEM=="tty", ATTRS{idVendor}=="xxxx",ATTRS{idProduct}=="yyyy", NAME="my_serial_device"```总结:Linux系统下串口设备的命名规则是由udev动态分配的,其命名规则基于设备的物理路径和设备类别。
linux c语言 串口读取数据的方法
linux c语言串口读取数据的方法Linux下使用C语言读取串口数据的方法引言:串口是计算机和外部设备进行通信的一种重要的通信接口。
在Linux系统中,要使用C语言读取串口数据,需要通过打开串口设备文件,设置串口参数,并进行读取数据的操作。
本文将介绍如何通过C语言在Linux下读取串口数据的方法。
目录:1. 了解串口的工作原理2. 打开串口设备文件3. 设置串口参数4. 读取串口数据5. 示例程序6. 总结1. 了解串口的工作原理:在开始编写C语言读取串口数据的方法前,首先需要了解串口的工作原理。
串口是通过硬件电路实现两台设备之间的数据传输,属于一种异步串行通信方式。
典型的串口包含发送数据引脚(TX)、接收数据引脚(RX)、数据位、停止位、奇偶校验位等。
2. 打开串口设备文件:在Linux系统中,每个串口设备都被映射到一个设备文件上,例如/dev/ttyS0代表第一个串口设备,/dev/ttyUSB0代表第一个USB串口设备。
要使用C语言读取串口数据,需要首先打开相应的串口设备文件。
在C语言中,使用open()函数打开串口设备文件。
open()函数的原型如下:cint open(const char *pathname, int flags);其中pathname参数指定要打开的串口设备文件路径,flags参数指定打开方式。
常用的flags参数有O_RDONLY(只读方式打开)、O_WRONLY (只写方式打开)和O_RDWR(读写方式打开)。
例如,要打开第一个串口设备文件,可以调用open()函数如下:cint fd = open("/dev/ttyS0", O_RDWR);if (fd == -1){perror("Error opening serial port");return -1;}当open()函数成功打开串口设备文件时,会返回一个非负整数的文件描述符fd,用于后续的操作。
简单的Linux串口通信程序
int fd; /*以读写方式打开串口*/ fd = open( "/dev/ttyS0", O_RDWR); if (-1 == fd){ perror("error"); }
17:43
3. 设置串口
最基本的设置串口包括波特率设置,校验位和停止位设置,数 据位。串口的设置主要是设置struct termios结构体的各成员值。
1
• 实验步骤
– 1.阅读理解源码
• 源码位置:serial\serial.c • 阅读源码方法
– Linux下使用gedit编辑器 – windows下使用SourceInsight软件
– 2.编译应用程序
2
【基础知识】
Linux操作系统从一开始就对串行口提供了很好的支持,为进行
串行通讯提供了大量的函数,本实验主要是为掌握在Linux中进行 串行通讯编程的基本方法。
2. 打开串口
在Linux 下串口文件是位于/dev 下,com1为/dev/ttyS0 ,com2 为/dev/ttyS1 操作系统 串口1 Windows COM1 Linux /dev/ttyS0 串口2 COM2 /dev/ttyS1 USB/RS-232转换器 /dev/ttyUSB0
打开串口是通过使用标准的文件打开函数操作:
struct termios { 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 */ };
linux 读取串口数据方法
linux 读取串口数据方法【原创实用版2篇】目录(篇1)一、Linux 读取串口数据的方法概述二、使用 C 语言读取串口数据三、使用 Qt 库读取串口数据四、使用 Python 读取串口数据五、总结正文(篇1)一、Linux 读取串口数据的方法概述在 Linux 系统中,串口是一种常用的设备接口,可以用于接收和发送数据。
Linux 提供了多种方法来读取和操作串口数据。
本文将介绍几种常见的方法,包括使用 C 语言、Qt 库和 Python 语言来读取串口数据。
二、使用 C 语言读取串口数据1.打开串口在 C 语言中,打开串口需要使用 fcntl 函数。
首先,需要包含头文件<fcntl.h>和<termios.h>。
然后,使用以下代码打开串口:```cint fd = open("/dev/ttyS0", O_RDWR);if (fd < 0) {perror("Can"t Open Serial Port");return -1;}```2.设置串口速度打开串口成功后,需要设置串口的波特率、数据位、校验位和停止位等参数。
可以使用以下代码设置串口速度:```cstruct termios tty;if (tcgetattr(fd, &tty)!= 0) {perror("Can"t Get Serial Port Attributes");return -1;}tty.c_cflag &= ~PARENB; // 清除奇偶校验位tty.c_cflag &= ~CSTOPB; // 使用一个停止位tty.c_cflag |= CS8; // 8 位数据位tty.c_cflag &= ~CRTSCTS; // 禁用硬件流控制tty.c_cflag |= CREAD | CLOCAL; // 使能读和忽略 modem 控制线if (tcsetattr(fd, TCSANOW, &tty)!= 0) {perror("Can"t Set Serial Port Attributes");return -1;}```3.读取串口数据使用以下代码读取串口数据:char buf[64];int len = read(fd, buf, sizeof(buf));if (len < 0) {perror("Can"t Read from Serial Port");return -1;}printf("Read data: %s", buf);```三、使用 Qt 库读取串口数据在 Qt 中,可以使用 QSerialPort 类来读取串口数据。
linux串口收发程序
下面简单介绍了,在REDHAT9操作系统下的使用终端接收发送串口数据recive程序的使用,它通过串口接收其它计算机传送到本地计算机的数据,程序稳定可靠2.源代码:接收串口程序recive.c的源码#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>#include <errno.h>#include <string.h>#define TRUE 1//初始化串口选项:void setTermios(struct termios * pNewtio, int uBaudRate){bzero(pNewtio, sizeof(struct termios)); /* clear struct for new port settings *///8N1pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL;pNewtio->c_iflag = IGNPAR;pNewtio->c_oflag = 0;pNewtio->c_lflag = 0; //non ICANON/*initialize all control charactersdefault values can be found in /usr/include/termios.h, andare given in the comments, but we don't need them here*/pNewtio->c_cc[VINTR] = 0; /* Ctrl-c */pNewtio->c_cc[VQUIT] = 0; /* Ctrl-\ */pNewtio->c_cc[VERASE] = 0; /* del */pNewtio->c_cc[VKILL] = 0; /* @ */pNewtio->c_cc[VEOF] = 4; /* Ctrl-d */pNewtio->c_cc[VTIME] = 5; /* inter-character timer, timeout VTIME*0.1 */ pNewtio->c_cc[VMIN] = 0; /* blocking read until VMIN character arrives */ pNewtio->c_cc[VSWTC] = 0; /* '\0' */pNewtio->c_cc[VSTART] = 0; /* Ctrl-q */pNewtio->c_cc[VSTOP] = 0; /* Ctrl-s */pNewtio->c_cc[VSUSP] = 0; /* Ctrl-z */pNewtio->c_cc[VEOL] = 0; /* '\0' */pNewtio->c_cc[VREPRINT] = 0; /* Ctrl-r */pNewtio->c_cc[VDISCARD] = 0; /* Ctrl-u */pNewtio->c_cc[VWERASE] = 0; /* Ctrl-w */pNewtio->c_cc[VLNEXT] = 0; /* Ctrl-v */pNewtio->c_cc[VEOL2] = 0; /* '\0' */}#define BUFSIZE 512int main(int argc, char **argv){int fd;int nread;int input;int *p=&input;//char buff[BUFSIZE];char buff[1024];struct termios oldtio, newtio;struct timeval tv;char *dev ="/dev/ttyS0";fd_set rfds;if ((fd = open(dev, O_RDWR | O_NOCTTY))<0){printf("err: can't open serial port!\n");return -1;}tcgetattr(fd, &oldtio); /* save current serial port settings */setTermios(&newtio, B9600);tcflush(fd, TCIFLUSH);tcsetattr(fd, TCSANOW, &newtio);//printf("Please input an integer.");//scanf("%d",&input);//*p=input;//printf("The integer you input is %d\n",*p);//printf("The integer you input is %d\n",&input); _sec=30;_usec=0;while (TRUE){printf("wait...\n");FD_ZERO(&rfds);FD_SET(fd, &rfds);if (select(1+fd, &rfds, NULL, NULL, &tv)>0) {printf("wait...\n");if (FD_ISSET(fd, &rfds)){//nread=read(fd, buff, BUFSIZE);nread=read(fd, buff ,1024);printf("readlength=%d\n", nread);//buff[nread]='\0';//printf("%s\n", buff);// buff='\0';printf("date=%d\n",buff);//printf("%d\n",fd);printf("%d\n", buff[1]);printf("%d\n", buff[2]);printf("%d\n", buff[3]);printf("%d\n", buff[4]);printf("%d\n", buff[5]);printf("%d\n", buff[6]);printf("%d\n", buff[7]);printf("%d\n", buff[8]);printf("%d\n", buff[9]);printf("%d\n", buff[10]);printf("%d\n", buff[11]);printf("%d\n", buff[12]);printf("%d\n", buff[13]);printf("%d\n", buff[14]);printf("%d\n", buff[15]);printf("%d\n", buff[16]);printf("%d\n", buff[17]);printf("%d\n", buff[18]);printf("%d\n", buff[19]);//printf("%d\n", buff[20]);//printf("%d\n", buff[21]);//printf("%d\n", buff[22]);//printf("%d\n", buff[23]);//printf("%d\n", buff[24]);//printf("%d\n", buff[25]);//printf("%d\n", buff[26]);//printf("%d\n", buff[27]);//printf("%d\n", buff[28]);//printf("%d\n", buff[29]);//printf("%d\n", buff[30]);//printf("%d\n", buff[31]);//printf("%d\n", buff[32]);//printf("%d\n", buff[1]);//printf("%d\n", buff[2]);//printf("%d\n", buff[3]);//printf("%d\n", buff[4]);//printf("%d\n", buff[5]);//printf("%d\n", buff[6]);//printf("%d\n", buff[7]);//printf("%d\n", buff[8]);//printf("%d\n", buff[9]);//printf("%d\n", buff[10]);//printf("%d\n", buff[32]);//printf("%d\n", buff[12]);//printf("%d\n", buff[13]);//printf("%d\n", buff[14]);//printf("%d\n", buff[15]);//printf("%d\n", buff[16]);}}}tcsetattr(fd, TCSANOW, &oldtio); close(fd);}串口发送程序send.c的源码#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>#include <errno.h>#include <string.h>//初始化串口选项:void setTermios(struct termios * pNewtio, int uBaudRate){bzero(pNewtio, sizeof(struct termios)); /* clear struct for new port settings */ //8N1pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL;pNewtio->c_iflag = IGNPAR;pNewtio->c_oflag = 0;pNewtio->c_lflag = 0; //non ICANON/*initialize all control charactersdefault values can be found in /usr/include/termios.h, andare given in the comments, but we don't need them here*/pNewtio->c_cc[VINTR] = 0; /* Ctrl-c */pNewtio->c_cc[VQUIT] = 0; /* Ctrl-\ */pNewtio->c_cc[VERASE] = 0; /* del */pNewtio->c_cc[VKILL] = 0; /* @ */pNewtio->c_cc[VEOF] = 4; /* Ctrl-d */pNewtio->c_cc[VTIME] = 5; /* inter-character timer, timeout VTIME*0.1 */ pNewtio->c_cc[VMIN] = 0; /* blocking read until VMIN character arrives */ pNewtio->c_cc[VSWTC] = 0; /* '\0' */pNewtio->c_cc[VSTART] = 0; /* Ctrl-q */pNewtio->c_cc[VSTOP] = 0; /* Ctrl-s */pNewtio->c_cc[VSUSP] = 0; /* Ctrl-z */pNewtio->c_cc[VEOL] = 0; /* '\0' */pNewtio->c_cc[VREPRINT] = 0; /* Ctrl-r */pNewtio->c_cc[VDISCARD] = 0; /* Ctrl-u */pNewtio->c_cc[VWERASE] = 0; /* Ctrl-w */pNewtio->c_cc[VLNEXT] = 0; /* Ctrl-v */pNewtio->c_cc[VEOL2] = 0; /* '\0' */}int main(int argc, char **argv){int fd;int input;int *p=&input;int nCount, nTotal, i;struct termios oldtio, newtio;char *dev ="/dev/ttyS0";//if ((argc!=3) || (sscanf(argv[1], "%d", &nTotal) != 1))//{//printf("err: need tow arg =%d!\n", argc );//return -1;//}//sscanf(argv[1], "%d", &nTotal)//{//printf("send date!\n", argc );//return -1;//}if ((fd = open(dev, O_RDWR | O_NOCTTY))<0){printf("err: can't open serial port!\n");return -1;}while (1) //循环读取数据{tcgetattr(fd, &oldtio); /* save current serial port settings */ setTermios(&newtio, B9600);tcflush(fd, TCIFLUSH);tcsetattr(fd, TCSANOW, &newtio);//for (i=0; i<nTotal; i++)//{//nCount=write(fd, argv[2], s]trlen(argv[2]));//argv[]={010*********d5ca};printf("Please input an integer.");scanf("%d",&input);*p=input;//nCount=write(fd,argv[p],strlen(argv[]));printf("The integer you input is %d\n",*p);printf("The integer you input is %d\n",&input);nCount=write(fd,"010*********d5ca/r",512);nCount=write(fd,p,1024);nCount=write(fd,&input,1024);printf("send date *p");printf("send date input");printf("send date 010*********d5ca\n"); //sleep(1);}tcsetattr(fd, TCSANOW, &oldtio); close(fd);return 0;}。
linux串口配置参数
linux串口配置参数Linux操作系统提供了丰富的串口资源,支持通过串口与外部设备进行通信。
在Linux下配置串口参数需要关注以下几个关键要素:串口号、波特率、数据位、停止位、校验位和流控制等。
下面将详细介绍如何配置这些参数。
一、确定串口号在Linux系统中,每个串口设备都有一个唯一的串口号,可以通过ls/dev/tty*命令查看系统中的所有串口设备。
在配置串口参数之前,需要确定要使用的串口号。
通常,串口号以/dev/ttyS或/dev/ttyUSB开头,可以根据实际情况进行判断。
二、配置波特率波特率是串口通信中最基本的参数之一,它决定了数据传输的速度。
在Linux系统中,可以使用minicom或screen等终端仿真器进行串口通信,这些工具默认使用9600波特率。
可以根据实际需求进行调整,常见的波特率有115200、57600等。
可以使用cat/proc/stty串口文件查看当前配置的波特率。
三、设置数据位、停止位和校验位数据位、停止位和校验位是串口通信中的其他重要参数。
数据位决定了传输的数据位数,常见的有5、6、7和8位等;停止位决定了传输的停顿时间,常见的有1、1.5和2位等;校验位则用于检查数据传输过程中的错误,常见的有奇校验和偶校验等。
这些参数可以在终端仿真器的配置中进行设置,也可以使用stty命令进行全局配置。
四、启用流控制流控制用于控制数据传输过程中的流量,避免数据传输过快导致丢包或溢出等问题。
常见的流控制方式有软件流控制(xon/xoff)和硬件流控制(rts/cts)。
软件流控制通过检测串口输入流控制信号(xon/xoff)来实现流量控制;硬件流控制通过控制数据端口的电平来实现流量控制。
可以在终端仿真器的配置中启用相应的流控制方式。
五、测试配置效果完成串口参数配置后,可以通过串口通信测试来验证配置是否正确。
可以使用cat或echo命令将数据发送到串口设备,并使用另一终端仿真器接收数据,观察是否能够正常通信。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
பைடு நூலகம்*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0)
{
if (speed == name_arr[i])
{
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
options.c_cc[VTIME] = 150; // 15 seconds
options.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0)
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
fprintf(stderr,"Unsupported parity\n");
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
}
}
/**
*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄*
*@param databits 类型 int 数据位 取值 为 7 或者8*
*@param stopbits 类型 int 停止位 取值为 1 或者2*
B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300,
38400, 19200, 9600, 4800, 2400, 1200, 300, };
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 转换为偶效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
if (-1 == fd)
{ /*设置数据位数*/
perror("Can't Open Serial Port");
return -1;
}
else
return fd;
}
/**
*@breif main()
*/
int main(int argc, char **argv)
{
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits) /*设置数据位数*/
{
case 7:
options.c_cflag |= CS7;
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix标准函数定义*/
#include <sys/types.h> /**/
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size\n");
return (FALSE);
}
switch (parity)
{
printf("\nLen %d\n",nread);
buff[nread+1]='\0';
printf("\n%s",buff);
}
}
//close(fd);
//exit(0);
}
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
}
/**
*@breif 打开串口
*/
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
#include <sys/stat.h> /**/
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX终端控制定义*/
#include <errno.h> /*错误号定义*/
/***@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void*/
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
exit(0);
}
if (set_Parity(fd,8,1,'N')== FALSE)
{
printf("Set Parity Error\n");
exit(1);
}
while(1)
{
while((nread = read(fd,buff,512))>0)
return (FALSE);
}
/* 设置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
{
int fd;
int nread;
char buff[512];
char *dev ="/dev/ttyS1";
fd = OpenDev(dev);
if (fd>0)
set_speed(fd,19200);
else
{
printf("Can't Open Serial Port!\n");
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;