先说经过试验还不行的方案:

①:Linux串口通讯(mark, space校验方式的实现)  http://hi.baidu.com/czyt_/item/fcaaea0ce57910c074cd3c00

②:Linux操作系统下微机与单片机组成的多机通讯系统  http://wenku.baidu.com/view/35e48a97dd88d0d233d46a16.html

③:  Linux串口通讯(mark, space校验方式的实现)http://blog.csdn.net/diegotj/article/details/5455651


接到space校验的帖子:

多机通信问题 http://topic.csdn.net/u/20070418/07/DFD15B4D-47B7-48EF-BBED-91088EBD59B7.html

我目前在做一个ARM处理器(S3C4510)和多个单片机(AT2051)通过串口通信的程序,多机通信先发地址后发数据,发地址必须使第9 

位信息为1,发数据必须使第9位为0; 
顺便说一下:S3C4510(uClinux)和AT2051通信是可以建立起来的. 
发地址前: 
struct   termios   opt; 
opt.c_cflag   =   BAUDRATE   |   CS8   |   PARENB   |   PARODD   |   CMSPAR   |   CLOCAL   |   CREAD;
opt.c_iflag   =   (INPCK   |   IGNBRK   |   IGNPAR); 
发数据前: 
struct   termios   opt; 
opt.c_cflag   =   BAUDRATE   |   CS8   |   PARENB   |   CMSPAR   |   CLOCAL   |   CREAD;
opt.c_cflag   &=   ~PARODD; 
我目前是想做一个简单的测试程序: 
我在发地址前: 
设置好BAUDRATE,数据位8位,奇校验,一个停止位 
发数据前: 
设置好BAUDRATE,数据位8位,偶校验,一个停止位 
可是通讯建立不起来,不知道该如何做,请高人指点!谢谢!

linux下的RS232串口通讯  http://www.cnblogs.com/xiaoxia/archive/2011/07/01/2095448.html

 option.c_cflag |= PARENB; /*设置校验位使能*/
  option.c_cflag |= PARODD; /*设置为奇校验*/
  //option.c_cflag &= ~PARODD; /*设置为偶校验*/
  
  //以下设置仅限于linux系统
  option.c_cflag |= CMSPAR;  
  /*设置space校验,奇偶校验位恒为0*/
  //option.c_cflag &= ~PARODD;或者是直接没有设置 
/*设置mark校验,奇偶校验位恒为1*/
 //option.c_cflag |= PARODD;


linux下串口用mark和space的方式编程问题! http://topic.csdn.net/u/20090709/16/f0891784-6dba-4b50-8e3e-8ecda5510631.html?seed=1707433176&r=79869939#r_79869939

小弟最近做了一个项目,操作系统是linux,平台为arm,串口通信要求使用8bits数据、1bit mark/space、1bit停止位,
当传模块地址是mark置1,当传数据时,mark置0。我查到了串口属性设置为:
  options.c_cflag |= PARENB | CS8 | CMSPAR |PARODD
  通信协议要求一个数据包为 addr+data addr为1个byte,data为3个bytes,我程序中是这样实现的。
    
  options.c_cflag |= PARENB | CS8 | CMSPAR |PARODD;
  set_port(options);
  send_data(&addr);
  options.c_cflag |= PARENB | CS8 | CMSPAR ;
  set_port(options);
  send_data(&data);
   
  recv_data(buf);
  我这样提示发送数据成功,但总接收不到数据,请用过这样方式的大侠给点提示,谢谢了!

谁教我写串口收发数据的程序啊 http://topic.csdn.net/t/20041019/14/3470112.html

case   'S ': 
case   's ':     /*as   no   parity*/ 
options.c_cflag   &=   ~PARENB; 
options.c_cflag   &=   ~CSTOPB; 

串口通讯问题~~~请教原因 http://topic.csdn.net/t/20061115/16/5160305.html

case   'S ': 
case   's ':     /*as   no   parity*/ 
options.c_cflag   &=   ~PARENB; 
options.c_cflag   &=   ~CSTOPB; 


Linux 串口编程 http://www.cnblogs.com/lovemo1314/archive/2010/10/29/1864327.html

http://data.eefocus.com/myspace/0/131/bbs/1185380147/eef8932e.pdf

 [基础|理论|实验]linux下的RS232串口通讯  http://www.cnblogs.com/xiaoxia/archive/2011/07/01/2095448.html

这个把问题解决了!!!!!

参考了一下串口的硬件驱动程序:
Stick     even parity    parity enable        parity
-               -               0                    无校验

0               0               1                    奇校验

0               1               1                   奇校验

1               0               1                    Mark

1               1               1                    space

得到如下的校验设置方式:
#define CMSPAR 010000000000
本句使能了stick parity的校验可行性
Mark校验
options.c_cflag |= PARENB | CS8 | CMSPAR |PARODD;
Space校验
options.c_cflag |= PARENB | CS8 | CMSPAR;


====================================================================================================================================

2012年10月12日17:44:50:

在多机通信中根本用不到奇校验和偶校验,所以open时就直接把CMSPAR设置上去,这样之后的朦胧中的

奇校验====》mark校验

偶校验====》space校验

这么说来,这个CMSPAR值是多少也很重要了,根据硬件平台的不同,他的值也会有所不同,这个要看CPU手册。

====================================================================================================================================

2012年10月12日17:48:06:

如果这么相关,那么在虚拟机中的Linux会不会受此影响呢,看minicom有mark,space功能,看看它的能否使用起来!


9600 8S1 还能进中断!这 又进一步说明,虚拟机惹的祸!!!

这个说法在 CSDN 论坛找到过,不过没在意!!!

虚拟机中不能进行mark space校验,这是我暂时的定论!!!

Logo

更多推荐