linux和windows下串口的使用.docx
- 文档编号:5071530
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:13
- 大小:22.10KB
linux和windows下串口的使用.docx
《linux和windows下串口的使用.docx》由会员分享,可在线阅读,更多相关《linux和windows下串口的使用.docx(13页珍藏版)》请在冰豆网上搜索。
linux和windows下串口的使用
设置串口属性通常有以下几个步骤:
1.包含头文件:
#include
#include
#include
#include
#include
#include
#include
#include
#include
2.termios结构体
structtermios{
tcflag_tc_iflag;/*输入参数*/
tcflag_tc_oflag;/*输出参数*/
tcflag_tc_cflag;/*控制参数*/
tcflag_tc_ispeed;/*输入波特率*/
tcflag_tc_ospeed;/*输出波特率*/
cc_tc_line;/*线控制*/
cc_tc_cc[NCCS];/*控制字符*/
};
3.设置波特率
structtermiosopt;
tcgetattr(fd,&Opt);//设置前先获取属性
tcflush(fd,TCIOFLUSH);
cfsetispeed(&stOpt,DEVICE);//cfgetispeed获取波特率
cfsetospeed(&stOpt,DEVICE);//cfgetospeed
tcsetattr(fd,TCSANOW,&options);//设置属性
4.配置串口属性(包括:
数据位、校验位、停止位等)
structtermiosoptions;
tcgetattr(iCom,&options);//设置前先获取
tcflush(fd,TCIFLUSH);//清空缓存数据
tcsetattr(fd,TCSANOW,&options);//设置属性
校验位:
奇校验:
options.c_cflag|=(PARODD|PARENB);//
options.c_iflag|=INPCK;//
偶校验:
options.c_cflag|=PARENB;
options.c_cflag&=~PARODD;
options.c_iflag|=INPCK;
无校验:
options.c_cflag&=~PARENB;
options.c_iflag&=~INPCK;
停止位:
1位:
options.c_cflag&=~CSTOPB;//
2位:
options.c_cflag|=CSTOPB;
数据位:
7位:
options.c_cflag&=~CSIZE;//
options.c_cflag|=CS7;
8位:
options.c_cflag&=~CSIZE;
options.c_cflag|=CS8;
超时:
tcflush(iCom,TCIFLUSH);//清空缓存
stOpt.c_cc[VTIME]=120;//超时12秒
stOpt.c_cc[VMIN]=0;//
5.常用属性
PARODD输入输出是奇校验
PARENB允许输出产生奇偶信息以及输入的奇偶校验。
INPCK启用输入奇偶检测
CSIZE字符长度掩码。
取值为CS5,CS6,CS7,或CS8。
CSTOPB设置两个停止位,而不是一个。
例:
Linux下打开串口(9600,n,8,1):
//变量声明
td_s32g_fdCom[4]={-1,-1,-1,-1};//串口句柄
structtermiosstOpt;
//打开设备
g_fdCom[2]=open("/dev/ttyAMA1",O_RDWR);//|O_NOCTTY|O_NDELAY|O_SYNC
tcgetattr(g_fdCom[2],&stOpt);
tcflush(g_fdCom[2],TCIFLUSH);
//设置波特率
//cfmakeraw(&stOpt);//存储属性吗?
这句话导致超时设置失效
cfsetispeed(&stOpt,B9600);//cfgetispeed获取波特率
cfsetospeed(&stOpt,B9600);//cfgetospeed
//串口控制属性配置
/*有这个配置,其他配置省略*/
//tcsetattr(iCom,TCSANOW,&stOpt);
//stOpt.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG);//Input
//stOpt.c_oflag&=~OPOST;//Output
//数据位
stOpt.c_cflag&=~CSIZE;
stOpt.c_cflag|=CS8;
//校验位,奇校验
stOpt.c_cflag&=~PARENB;//无校验
stOpt.c_iflag&=~INPCK;//不启用奇偶校验检测,若采用无校验,则不启用
//stOpt.c_iflag|=INPCK;
//停止位
stOpt.c_cflag&=~CSTOPB;//1位停止位
stOpt.c_oflag&=~OPOST;
//超时
tcflush(g_fdCom[2],TCIFLUSH);
stOpt.c_cc[VTIME]=150;//超时15秒
stOpt.c_cc[VMIN]=0;//
//cfmakeraw(&stOpt);//存储属性吗?
这句话导致超时设置失效
if(tcsetattr(g_fdCom[2],TCSANOW,&stOpt)!
=0)
{
printf("setparityerror\n");
return-1;
}
Windows下打开串口(9600,n,8,1):
//变量声明:
HANDLEhCom;//串口句柄
DCBdcpProperty;
//打开设备
hCom=CreateFile(__T("COM1"),//COM1口
GENERIC_READ|GENERIC_WRITE,//允许读写
0,//独占方式,串口不能共享,故为零
NULL,
OPEN_EXISTING,//打开而不是创建
0,//同步方式、、FILE_FLAG_OVERLAPPED表示是异步
NULL);
if(hCom==(HANDLE)-1)
{
MessageBox(__T("打开COM失败!
"));
}
else
{
MessageBox(__T("串口已打开"));
}
//设定超时
//读超时
COMMTIMEOUTSTimeOuts;
BOOLbSuccess;
TimeOuts.ReadIntervalTimeout=0;
TimeOuts.ReadTotalTimeoutMultiplier=100;
TimeOuts.ReadTotalTimeoutConstant=5000;//5秒
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。
//写超时
TimeOuts.WriteTotalTimeoutMultiplier=5000;
TimeOuts.WriteTotalTimeoutConstant=5000;
bSuccess=SetCommTimeouts(hCom,&TimeOuts);//设置超时
if(!
bSuccess)
{
MessageBox(__T("设置超时失败"));
}
//配置串口属性
GetCommState(hCom,&dcpProperty);//未获取则不能设置
//设置波特率
dcpProperty.BaudRate=CBR_9600;//波特率
//dcpProperty.fParity=-1;//允许奇偶校验
//dcpProperty.Parity=NOPARITY;//奇校验
dcpProperty.StopBits=ONESTOPBIT;//1位停止位
dcpProperty.ByteSize=8;//通讯字节数
SetCommState(hCom,&dcpProperty);
//清空读写缓存
PurgeComm(g_hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
//读写操作。
。
附录:
DESCRIPTION描述
termios函数族提供了一个常规的终端接口,用于控制非同步通信端口。
这里描述的大部分属性有一个termios_p类型的参数,它是指向一个termios结构的指针。
这个结构包含了至少下列成员:
tcflag_tc_iflag;/*输入模式*/
tcflag_tc_oflag;/*输出模式*/
tcflag_tc_cflag;/*控制模式*/
tcflag_tc_lflag;/*本地模式*/
cc_tc_cc[NCCS];/*控制字符*/
c_iflag标志常量:
IGNBRK
忽略输入中的BREAK状态。
BRKINT
如果设置了IGNBRK,将忽略BREAK。
如果没有设置,但是设置了BRKINT,那么BREAK将使得输入和输出队列被刷新,如果终端是一个前台进程组的控制终端,这个进程组中所有进程将收到SIGINT信号。
如果既未设置IGNBRK也未设置BRKINT,BREAK将视为与NUL字符同义,除非设置了PARMRK,这种情况下它被视为序列\377\0\0。
IGNPAR
忽略桢错误和奇偶校验错。
PARMRK
如果没有设置IGNPAR,在有奇偶校验错或桢错误的字符前插入\377\0。
如果既没有设置IGNPAR也没有设置PARMRK,将有奇偶校验错或桢错误的字符视为\0。
INPCK
启用输入奇偶检测。
ISTRIP
去掉第八位。
INLCR
将输入中的NL翻译为CR。
IGNCR
忽略输入中的回车。
ICRNL
将输入中的回车翻译为新行(除非设置了IGNCR)。
IUCLC
(不属于POSIX)将输入中的大写字母映射为小写字母。
IXON
启用输出的XON/XOFF流控制。
IXANY
(不属于POSIX.1;XSI)允许任何字符来重新开始输出。
(?
)
IXOFF
启用输入的XON/XOFF流控制。
IMAXBEL
(不属于POSIX)当输入队列满时响零。
Linux没有实现这一位,总是将它视为已设置。
POSIX.1中定义的c_oflag标志常量:
OPOST
启用具体实现自行定义的输出处理。
其余c_oflag标志常量定义在POSIX1003.1-2001中,除非另外说明。
OLCUC
(不属于POSIX)将输出中的小写字母映射为大写字母。
ONLCR
(XSI)将输出中的新行符映射为回车-换行。
OCRNL
将输出中的回车映射为新行符
ONOCR
不在第0列输出回车。
ONLRET
不输出回车。
OFILL
发送填充字符作为延时,而不是使用定时来延时。
OFDEL
(不属于POSIX)填充字符是ASCIIDEL(0177)。
如果不设置,填充字符则是ASCIINUL。
NLDLY
新行延时掩码。
取值为NL0和NL1。
CRDLY
回车延时掩码。
取值为CR0,CR1,CR2,或CR3。
TABDLY
水平跳格延时掩码。
取值为TAB0,TAB1,TAB2,TAB3(或XTABS)。
取值为TAB3,即XTABS,将扩展跳格为空格(每个跳格符填充8个空格)。
(?
)
BSDLY
回退延时掩码。
取值为BS0或BS1。
(从来没有被实现过)
VTDLY
竖直跳格延时掩码。
取值为VT0或VT1。
FFDLY
进表延时掩码。
取值为FF0或FF1。
c_cflag标志常量:
CBAUD
(不属于POSIX)波特率掩码(4+1位)。
CBAUDEX
(不属于POSIX)扩展的波特率掩码(1位),包含在CBAUD中。
(POSIX规定波特率存储在termios结构中,并未精确指定它的位置,而是提供了函数cfgetispeed()和cfsetispeed()来存取它。
一些系统使用c_cflag中CBAUD选择的位,其他系统使用单独的变量,例如sg_ispeed和sg_ospeed。
)
CSIZE
字符长度掩码。
取值为CS5,CS6,CS7,或CS8。
CSTOPB
设置两个停止位,而不是一个。
CREAD
打开接受者。
PARENB
允许输出产生奇偶信息以及输入的奇偶校验。
PARODD
输入和输出是奇校验。
HUPCL
在最后一个进程关闭设备后,降低modem控制线(挂断)。
(?
)
CLOCAL
忽略modem控制线。
LOBLK
(不属于POSIX)从非当前shell层阻塞输出(用于shl)。
(?
)
CIBAUD
(不属于POSIX)输入速度的掩码。
CIBAUD各位的值与CBAUD各位相同,左移了IBSHIFT位。
CRTSCTS
(不属于POSIX)启用RTS/CTS(硬件)流控制。
c_lflag标志常量:
ISIG
当接受到字符INTR,QUIT,SUSP,或DSUSP时,产生相应的信号。
ICANON
启用标准模式(canonicalmode)。
允许使用特殊字符EOF,EOL,EOL2,ERASE,KILL,LNEXT,REPRINT,STATUS,和WERASE,以及按行的缓冲。
XCASE
(不属于POSIX;Linux下不被支持)如果同时设置了ICANON,终端只有大写。
输入被转换为小写,除了以\前缀的字符。
输出时,大写字符被前缀\,小写字符被转换成大写。
ECHO
回显输入字符。
ECHOE
如果同时设置了ICANON,字符ERASE擦除前一个输入字符,WERASE擦除前一个词。
ECHOK
如果同时设置了ICANON,字符KILL删除当前行。
ECHONL
如果同时设置了ICANON,回显字符NL,即使没有设置ECHO。
ECHOCTL
(不属于POSIX)如果同时设置了ECHO,除了TAB,NL,START,和STOP之外的ASCII控制信号被回显为^X,这里X是比控制信号大0x40的ASCII码。
例如,字符0x08(BS)被回显为^H。
ECHOPRT
(不属于POSIX)如果同时设置了ICANON和IECHO,字符在删除的同时被打印。
ECHOKE
(不属于POSIX)如果同时设置了ICANON,回显KILL时将删除一行中的每个字符,如同指定了ECHOE和ECHOPRT一样。
DEFECHO
(不属于POSIX)只在一个进程读的时候回显。
FLUSHO
(不属于POSIX;Linux下不被支持)输出被刷新。
这个标志可以通过键入字符DISCARD来开关。
NOFLSH
禁止在产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列。
TOSTOP
向试图写控制终端的后台进程组发送SIGTTOU信号。
PENDIN
(不属于POSIX;Linux下不被支持)在读入下一个字符时,输入队列中所有字符被重新输出。
(bash用它来处理typeahead)
IEXTEN
启用实现自定义的输入处理。
这个标志必须与ICANON同时使用,才能解释特殊字符EOL2,LNEXT,REPRINT和WERASE,IUCLC标志才有效。
c_cc数组定义了特殊的控制字符。
符号下标(初始值)和意义为:
VINTR
(003,ETX,Ctrl-C,oralso0177,DEL,rubout)中断字符。
发出SIGINT信号。
当设置ISIG时可被识别,不再作为输入传递。
VQUIT
(034,FS,Ctrl-\)退出字符。
发出SIGQUIT信号。
当设置ISIG时可被识别,不再作为输入传递。
VERASE
(0177,DEL,rubout,or010,BS,Ctrl-H,oralso#)删除字符。
删除上一个还没有删掉的字符,但不删除上一个EOF或行首。
当设置ICANON时可被识别,不再作为输入传递。
VKILL
(025,NAK,Ctrl-U,orCtrl-X,oralso@)终止字符。
删除自上一个EOF或行首以来的输入。
当设置ICANON时可被识别,不再作为输入传递。
VEOF
(004,EOT,Ctrl-D)文件尾字符。
更精确地说,这个字符使得tty缓冲中的内容被送到等待输入的用户程序中,而不必等到EOL。
如果它是一行的第一个字符,那么用户程序的read()将返回0,指示读到了EOF。
当设置ICANON时可被识别,不再作为输入传递。
VMIN
非canonical模式读的最小字符数。
VEOL
(0,NUL)附加的行尾字符。
当设置ICANON时可被识别。
VTIME
非canonical模式读时的延时,以十分之一秒为单位。
VEOL2
(notinPOSIX;0,NUL)另一个行尾字符。
当设置ICANON时可被识别。
VSWTCH
(notinPOSIX;notsupportedunderLinux;0,NUL)开关字符。
(只为shl所用。
)
VSTART
(021,DC1,Ctrl-Q)开始字符。
重新开始被Stop字符中止的输出。
当设置IXON时可被识别,不再作为输入传递。
VSTOP
(023,DC3,Ctrl-S)停止字符。
停止输出,直到键入Start字符。
当设置IXON时可被识别,不再作为输入传递。
VSUSP
(032,SUB,Ctrl-Z)挂起字符。
发送SIGTSTP信号。
当设置ISIG时可被识别,不再作为输入传递。
VDSUSP
(notinPOSIX;notsupportedunderLinux;031,EM,Ctrl-Y)延时挂起信号。
当用户程序读到这个字符时,发送SIGTSTP信号。
当设置IEXTEN和ISIG,并且系统支持作业管理时可被识别,不再作为输入传递。
VLNEXT
(notinPOSIX;026,SYN,Ctrl-V)字面上的下一个。
引用下一个输入字符,取消它的任何特殊含义。
当设置IEXTEN时可被识别,不再作为输入传递。
VWERASE
(notinPOSIX;027,ETB,Ctrl-W)删除词。
当设置ICANON和IEXTEN时可被识别,不再作为输入传递。
VREPRINT
(notinPOSIX;022,DC2,Ctrl-R)重新输出未读的字符。
当设置ICANON和IEXTEN时可被识别,不再作为输入传递。
VDISCARD
(notinPOSIX;notsupportedunderLinux;017,SI,Ctrl-O)开关:
开始/结束丢弃未完成的输出。
当设置IEXTEN时可被识别,不再作为输入传递。
VSTATUS
(notinPOSIX;notsupportedunderLinux;statusrequest:
024,DC4,Ctrl-T).
这些符号下标值是互不相同的,除了VTIME,VMIN的值可能分别与VEOL,VEOF相同。
(在non-canonical模式下,特殊字符的含义更改为延时含义。
MIN表示应当被读入的最小字符数。
TIME是以十分之一秒为单位的计时器。
如果同时设置了它们,read将等待直到至少读入一个字符,一旦读入MIN个字符或者从上次读入字符开始经过了TIME时间就立即返回。
如果只设置了MIN,read在读入MIN个字符之前不会返回。
如果只设置了TIME,read将在至少读入一个字符,或者计时器超时的时候立即返回。
如果都没有设置,read将立即返回,只给出当前准备好的字符。
)(?
)
tcgetattr()得到与fd指向的对象相关的参数,将它们保存于termios_p引用的termios结构中。
函数可以从后台进程中调用;但是,终端属性可能被后来的前台进程所改变。
tcsetattr()设置与终端相关的参数(除非需要底层支持却无法满足),使用termios_p引用的termios结构。
optional_actions指定了什么时候改变会起作用:
TCSANOW
改变立即发生
TCSADRAIN
改变在所有写入fd的输出都被传输后生效。
这个函数应当用于修改影响输出的参数时使用。
TCSAFLUSH
改变在所有写入fd引用的对象的输出都被传输后生效,所有已接受但未读入的输入都在改变发生前丢弃。
tcsendbreak()传送连续的0值比特流,持续一段时间,如果终端使用异步串行数据传输的话。
如果duration是0,它至少传输0.25秒,不会超过0.5秒。
如果duration非零,它发送的时间长度由实现定义。
如果终端并非使用异步串行数据传输,tcsendbreak()什么都不做。
tcdrain()等待直到所有写入fd引用的对象的输出都被传输。
tcflush()丢弃要写入引用的对象,但是尚未传输的数据,或者收到但是尚未读取的数据,取决于queue_selector的值:
TCIFLUSH
刷新收到的数据但是不读
TCOFLUSH
刷新写入的数据但是不传送
TCIOFLUSH
同时刷新收到的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux windows 串口 使用