串口通讯的问题。头疼+郁闷

bluesnowly 2003-08-19 11:27:53
我用串口与外部设备进行通讯。通讯帧格式如下。
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);

急切盼望回复。谢谢!!!













...全文
66 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwunix 2003-08-19
  • 打赏
  • 举报
回复
我如何给外部设备发这样的命令帧呢????
将数据位设置成8位,并设置送两个停止位
起始和停止位的数据是串口自动加到我发的数据的头尾上的吧?
是的。
D0--D7我可以写到一个字符中然后向串口设备文件中写入。但D8位我如何操作呢。难道还要再用一个字符吗,但想想也不行。或者是在串口termios结构初始化的时候通过置c_cflag位来实现?
newtio.c_cflag= |= CSTOPB
设置为送两个停止位。
用上面的方法试试
bluesnowly 2003-08-19
  • 打赏
  • 举报
回复
那能找到那写基地址及其偏移量的定义吗?
wwwunix 2003-08-19
  • 打赏
  • 举报
回复
我只有书,没有电子档
bluesnowly 2003-08-19
  • 打赏
  • 举报
回复
没有啊。我看那程序就直接用的,没有在KERNEL状态下操作的。
我用过的一些采集,I/O的板子也是直接对硬件地址操作,对这个基地址加偏移量后用OUTB,INB读写都能完成一些特定的功能。但串口的地址定义不知道哪里去找。
你说的那个PC接口技术大全,在网上能找到吗,能否告诉我地址。如果你有能否把那定义发给我呢,或者贴在这里。
我的信箱是bluesnowly@163.com
wwwunix 2003-08-19
  • 打赏
  • 举报
回复
2F8/3F8是硬件地址,在DOS下可以直接操作。在Linux必须在Kernel态才能操作。
关于串口的具体细节可以参考《PC接口技术大全》
bluesnowly 2003-08-19
  • 打赏
  • 举报
回复
这么麻烦吗。我看过以前有人做的串口程序就直接用OUTB对。串口的基地址如2F8,3F8进行操作。不过好象都是用基地址加个偏移量来做的。如OUTB(0X00,COM_ADDR+3);用这种方式来初始画串口。不过不知道基地址和各偏移量的意义和用法。也不知道哪里可以查找得到。你对这种方式有了解吗??
wwwunix 2003-08-19
  • 打赏
  • 举报
回复
可以,不过要写一个内核模块。
bluesnowly 2003-08-19
  • 打赏
  • 举报
回复
不是单片机,是一台仪器。不过它的串口可能是单片机控制的。
是的。我查了你说的资料。在单片机中很好对D8位操作。但是在C语言中,就不好做了。
不过我想是否能过直接,用OUTB(),对3FBH进行操作,来对D8置位呢
wwwunix 2003-08-19
  • 打赏
  • 举报
回复
另:外部设备是单片机吗?
wwwunix 2003-08-19
  • 打赏
  • 举报
回复
我想可能你需要去查查下面的资料
通过对串口的8250线控寄存器3FBH写如特定的控制字即可实现D8为1或为0。
wwwunix 2003-08-19
  • 打赏
  • 举报
回复
刚才仔细想了一下,觉得我上面的方法有问题.:-(
我再想想有什么其他方法.
bluesnowly 2003-08-19
  • 打赏
  • 举报
回复
哦,明白。是用两个停止位中的一个来做我的D8位是吧。
那如果对这两个停止为的前一个操作,让它为0,或者为1呢。实际上D8位是用来做多机通讯的
如果我发送的地址跟外部设备地址相同,则本机外设的D8均为0。接着向外设发送命令,外设D8为0的设备返回数据后,
我得再次把本机D8设为1。以便下次判断别的设备来用。
所以如何才能方便的更改D8位的值呢,是频繁的对串口初始化吗

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧