linux 串口编程记录(一)串口参数设置

    一些常用串口属性的设置方法。

  • 设置流控制
  • termios_new.c_cflag &= ~CRTSCTS; //不使用流控制
  • termios_new.c_cflag |= CRTSCTS; //使用硬件流控制
  • termios_new.c_iflag |= IXON|IXOFF|IXANY; //使用软件流控制
  • 屏蔽字符大小位
  • termios_new.c_cflag &= ~CSIZE;
  • 设置数据位大小
  • termios_new.c_cflag |= CS8; //使用8位数据位
  • termios_new.c_cflag |= CS7; //使用7位数据位
  • termios_new.c_cflag |= CS6; //使用6位数据位
  • termios_new.c_cflag |= CS5; //使用5位数据位
  • 设置奇偶校验方式
  • termios_new.c_cflag &= ~PARENB; //无奇偶校验
  • termios_new.c_cflag |= PARENB; //奇校验
  • termios_new.c_cflag &= ~PARODD;
  • termios_new.c_cflag |= PARENB; //偶校验
  • termios_new.c_cflag &= ~PARODD;
  • 停止位
  • termios_new.c_cflag |= CSTOPB; //2位停止位
  • termios_new.c_cflag &= ~CSTOPB; //1位停止位
  • 输出模式
  • termios_new.c_cflag &= ~OPOST; //原始数据(RAW)输出
  • 控制字符
  • termios_new.c_cc[VMIN] = 1; //读取字符的最小数量
  • termios_new.c_cc[VTIME] = 1; //读取第一个字符的等待时间
  • 关闭终端回显,键盘输入的字符不会在终端窗口显示。
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <termios.h>
  • #include <unistd.h>
  • int main(void)
  • {
  • struct termios ts,ots;
  • char passbuf[1024];
  • tcgetattr(STDIN_FILENO,&ts); /* STDIN_FILENO的值是1,表示标准输入的文件描述符 */
  • ots = ts;
  • ts.c_lflag &= ~ECHO; /* 关闭回终端回显功能*/
  • ts.c_lflag |= ECHONL;
  • tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts); /* 应用新终端设置 */
  • fgets(passbuf,1024,stdin); /* 输入字符不会在终端显示 */
  • printf("you input character = %s/n",passbuf);
  • tcsetattr(STDIN_FILENO,TCSANOW,&ots); /* 恢复旧的终端设备 */

}

例子:串口参数设置函数

int Serial::SetPara(int serialfd,int speed,int databits , int stopbits ,int parity )

{

  struct termios termios_new;

bzero( &termios_new, sizeof(termios_new));//等价于memset(&termios_new,sizeof(termios_new));

cfmakeraw(&termios_new);//就是将终端设置为原始模式

termios_new.c_cflag=BaudRate(speed);

termios_new.c_cflag |= CLOCAL | CREAD;   //  termios_new.c_iflag = IGNPAR | IGNBRK;

termios_new.c_cflag &= ~CSIZE;

switch (databits)

{

case 0:

termios_new.c_cflag |= CS5;

break;

case 1:

termios_new.c_cflag |= CS6;

break;

case 2:

termios_new.c_cflag |= CS7;

break;

case 3:

termios_new.c_cflag |= CS8;

break;

default:

termios_new.c_cflag |= CS8;

break;

}

switch (parity)

{

case 0:      //as no parity

termios_new.c_cflag &= ~PARENB;    //Clear parity enable

break;

case 1:

termios_new.c_cflag |= PARENB;     // Enable parity

termios_new.c_cflag &= ~PARODD;

break;

case 2:

termios_new.c_cflag |= PARENB;

termios_new.c_cflag |= ~PARODD;

break;

default:

termios_new.c_cflag &= ~PARENB;   // Clear parity enable

break;

}

switch (stopbits)// set Stop Bit

{

case 1:

termios_new.c_cflag &= ~CSTOPB;

break;

case 2:

termios_new.c_cflag |= CSTOPB;

break;

default:

termios_new.c_cflag &= ~CSTOPB;

break;

}

tcflush(serialfd,TCIFLUSH); // 清除输入缓存

tcflush(serialfd,TCOFLUSH); // 清除输出缓存

termios_new.c_cc[VTIME] = 1;   // MIN与 TIME组合有以下四种:1.MIN = 0 , TIME =0  有READ立即回传 否则传回 0 ,不读取任何字元

termios_new.c_cc[VMIN] = 1;  //    2、 MIN = 0 , TIME >0  READ 传回读到的字元,或在十分之一秒后传回TIME 若来不及读到任何字元,则传回0

tcflush (serialfd, TCIFLUSH);  //    3、 MIN > 0 , TIME =0  READ 会等待,直到MIN字元可读

return tcsetattr(serialfd,TCSANOW,&termios_new);  //    4、 MIN > 0 , TIME > 0 每一格字元之间计时器即会被启动 READ 会在读到MIN字元,传回值或

}

int Serial::BaudRate( int baudrate)
{
    switch(baudrate)
    {
    case 0:
        return (B2400);
    case 1:
        return (B4800);
    case 2:
        return (B9600);
    case 3:
        return (B19200);
    case 4:
        return (B38400);
    case 5:
        return (B57600);
    case 6:
        return (B115200);
    default:
        return (B9600);
    }
}

时间: 2024-08-28 23:00:30

linux 串口编程记录(一)串口参数设置的相关文章

[RK_2014_0910]串口编程中,串口数据接收不全的可能原因

[情形1] [ubuntu14.04-->Win8] [环境描述] PC1:Win8,运行串口调试工具:USR-TCP232-Test.exe:串口COM1的参数设置为“9600,8,1,N". PC2:Ubuntu14.04:串口/dev/ttyUSB0的参数设置为“9600,8,1,N". [代码描述] // 串口传输线程 处理函数 void* CTestEth::ThreadFuncHandleSerialPortTransfer(IN void* arg) { if ((

linux 下串口编程VTIME和VMIN的设置

VTIME定义要求等待的时间量(取值不能大于cc_t). VMIN定义了要求等待的最小字节数. options.c_cc[VTIME] = X; //设置从获取到1个字节后开始计时的超时时间 options.c_cc[VMIN] = Y;   //设置要求等待的最小字节数 在原始模式下对read()函数的影响: 1.X=0,Y!=0.函数read()只有在读取了Y个字节的数据或者收到一个信号的时候才返回: 2.X!=0,Y=0.即使没有数据可以读取,read()函数等待X时间量后返回: 3.X!

linux I/O优化 磁盘读写参数设置

转载:http://wlservers.blog.163.com/blog/static/120622304201241715945256/ 关于页面缓存的信息,可以用cat /proc/meminfo 看到.其中的Cached 指用于pagecache的内存大小(diskcache-SwapCache).随着写入缓存页,Dirty 的值会增加.一旦开始把缓存页写入硬盘,Writeback的值会增加直到写入结束. Linux 用pdflush进程把数据从缓存页写入硬盘,查看有多少个pdflush

Linux高级编程--04.GDB调试程序(设置断点)

调试已运行的程序 在UNIX下用ps查看正在运行的程序的PID(进程ID),然后用gdb PID格式挂接正在运行的程序. 先用gdb 关联上源代码,并进行gdb,在gdb中用attach命令来挂接进程的PID.并用detach来取消挂接的进程. 暂停 / 恢复程序运行 调试程序中,暂停程序运行是必须的,GDB可以方便地暂停程序的运行.你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等.以便于你查看运行时的变量,以及运行时的流程. 当进程被gdb停住时,你可以使用info pr

串口编程-枚举遍历串口、获取PC所有串口名称、遍历注册表项、RegEnumValue用法

在网上找了几个关于遍历串口的例子,要么代码不完整,要么就有Bug,如读不了串口号大于10以上的. 经过本人的整理,现分享最终代码,vs2008下编译通过. //此方法同样适用于遍历windows开机启动项,只需稍加修改即可. void CEnumPortDlg::enumPort(void) { HKEY hKey; LPCTSTR lpSubKey="HARDWARE\\DEVICEMAP\\SERIALCOMM\\"; if(RegOpenKeyEx(HKEY_LOCAL_MACH

linux串口编程总结

串口本身,标准和硬件 ? 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口.虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代:而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之.但是,一方面因为串口本身造价便宜技术成熟,

使用Windows API进行串口编程

串口通信一般分为四大步:打开串口->配置串口->读写串口->关闭串口,还可以在串口上监听读写等事件. 1.打开和关闭串口 Windows中串口是作为文件来处理的,调用CreateFile()函数可以打开串口,函数执行成功返回串口句柄,出错返回INVALID_HANDLE_VALUE. HANDLE WINAPI CreateFile( _In_ LPCTSTR lpFileName,//要打开或创建的文件名 _In_ DWORD dwDesiredAccess,//访问类型 _In_ D

win7系统下用vspd软件进行串口编程实例

http://blog.csdn.net/qiusuo800/article/details/8299777 目前,我在学习C#串口编程类的基础知识,在网上也找了一些资料,但都存在一些问题,现在他们基础上再进行一定的修改,且更详细的表达如何实现串口编程,实现串口的发送与接收.本文通过一个完整的实例,目的在于说明在win7系统中进行串口编程时: 1.  用C# 编程串口的属性定义.成员变量以及方法等问题: 2.  掌握串口的发送与接收,利用虚拟串口来进行通讯,体验串口通讯: 至于具体的串口通信原理

linux串口编程参数配置详解

1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义 #include <stdlib.h>        //标准函数库定义 #include <unistd.h>       //Unix标准函数定义 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>          //文件控制定义 #incl