当前位置: 技术问答>linux和unix
串口通讯的问题。头疼+郁闷
来源: 互联网 发布时间:2015-04-07
本文导语: 我用串口与外部设备进行通讯。通讯帧格式如下。 1位起始为(0) D0--d7,8位数据位(低位在先) D8,1位控制位(第9位数据):1为地址,0为数据; 1位停止位(1)。 D8控制位得是为多机通讯而设的。D8位既奇偶校验...
我用串口与外部设备进行通讯。通讯帧格式如下。
1位起始为(0)
D0--d7,8位数据位(低位在先)
D8,1位控制位(第9位数据):1为地址,0为数据;
1位停止位(1)。
D8控制位得是为多机通讯而设的。D8位既奇偶校验位由软件控制为可编程位。通过对串口的8250线控寄存器3FBH写如特定的控制字即可实现D8为1或为0。
我现在要做的是,先给外部设备发送命令症。将D0-D7写如外部设备的地址00H-FFH。D8位置1。外部设备收到地址判断是否和自己地址相同,相同则D0-D7写如地址,D8置0回送。
我现在要问的是。我如何给外部设备发这样的命令帧呢????起始和停止位的数据是串口自动加到我发的数据的头尾上的吧?D0--D7我可以写到一个字符中然后向串口设备文件中写入。但D8位我如何操作呢。难道还要再用一个字符吗,但想想也不行。或者是在串口termios结构初始化的时候通过置c_cflag位来实现?但我不知道如何置,还望哪位高人指导指导。不胜感谢。
我的串口初始化如下。
fd = open(com2,O_RDWR | O_NOCTTY);
tcgetattr(fd,&oldtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = CS8|CLOCAL|CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME]=secends;
newtio.c_cc[VMIN]=charnum;
cfsetispeed( &newtio ,B9600);
cfsetospeed( &newtio ,B9600);
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
急切盼望回复。谢谢!!!
1位起始为(0)
D0--d7,8位数据位(低位在先)
D8,1位控制位(第9位数据):1为地址,0为数据;
1位停止位(1)。
D8控制位得是为多机通讯而设的。D8位既奇偶校验位由软件控制为可编程位。通过对串口的8250线控寄存器3FBH写如特定的控制字即可实现D8为1或为0。
我现在要做的是,先给外部设备发送命令症。将D0-D7写如外部设备的地址00H-FFH。D8位置1。外部设备收到地址判断是否和自己地址相同,相同则D0-D7写如地址,D8置0回送。
我现在要问的是。我如何给外部设备发这样的命令帧呢????起始和停止位的数据是串口自动加到我发的数据的头尾上的吧?D0--D7我可以写到一个字符中然后向串口设备文件中写入。但D8位我如何操作呢。难道还要再用一个字符吗,但想想也不行。或者是在串口termios结构初始化的时候通过置c_cflag位来实现?但我不知道如何置,还望哪位高人指导指导。不胜感谢。
我的串口初始化如下。
fd = open(com2,O_RDWR | O_NOCTTY);
tcgetattr(fd,&oldtio);
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = CS8|CLOCAL|CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME]=secends;
newtio.c_cc[VMIN]=charnum;
cfsetispeed( &newtio ,B9600);
cfsetospeed( &newtio ,B9600);
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
急切盼望回复。谢谢!!!
|
我如何给外部设备发这样的命令帧呢????
将数据位设置成8位,并设置送两个停止位
起始和停止位的数据是串口自动加到我发的数据的头尾上的吧?
是的。
D0--D7我可以写到一个字符中然后向串口设备文件中写入。但D8位我如何操作呢。难道还要再用一个字符吗,但想想也不行。或者是在串口termios结构初始化的时候通过置c_cflag位来实现?
newtio.c_cflag= |= CSTOPB
设置为送两个停止位。
用上面的方法试试
将数据位设置成8位,并设置送两个停止位
起始和停止位的数据是串口自动加到我发的数据的头尾上的吧?
是的。
D0--D7我可以写到一个字符中然后向串口设备文件中写入。但D8位我如何操作呢。难道还要再用一个字符吗,但想想也不行。或者是在串口termios结构初始化的时候通过置c_cflag位来实现?
newtio.c_cflag= |= CSTOPB
设置为送两个停止位。
用上面的方法试试