http://topic.csdn.net/u/20090421/13/494fb20a-704a-431c-9c42-7b637d06e22c.html
贴了很久没人能解决。
现在的环境是这样: 
(1)系统中安装了ELTIMA Virtual Serial Port虚拟串口对(COM5 <-->COM6) 
(2)上位机程序是 
    private SerialPort sp; 
    public Form1() 
    { 
      InitializeComponent(); 
      sp = new SerialPort("COM5", 9600, Parity.Odd, 8, StopBits.One); 
      sp.Open(); 
    }     private void button1_Click(object sender, EventArgs e) 
    {       byte[] b ={ 0xA0, 0x33, 0x1C, 0x01, 0x05 }; 
      sp.Parity = Parity.Odd; 
      sp.Write(b, 0, 1); 
      sp.Parity = Parity.Mark; 
      sp.Write(b, 1, 1); 
    } 下位机(模拟)程序也运行在同一台计算机上,不管用什么语言编写,关键是如何获取上位机发送过来的数据校验位? 
当然两者事先约定,第一字节用Odd,第二字节用Mark,但是下位机方必须把数据校验位获取到,才能进行判别。 
--------------------- 
请真正的高手把下位机程序不管用什么语言(开发环境)编写出来,分不够另外开帖子再加。 

解决方案 »

  1.   

    我是想写一个模拟的下位机用于教学 
    直接用虚拟串口对连接两个应用程序,不是真实的工业应用,看来SerialPort类是不行了,不知道用win32 API的CreateFile之类行不,实在不想去弄那个麻烦的驱动程序
    对于真实的下位机,如果上位机程序校验方式设置错误,是收不到下位机反馈回来的数据的(或是收到错误信息) 
    在教学中模拟一个下位机,学生学习上位机编程,如果他的的程序写得不对,应该达到和连接真实下位机一样得效果
      

  2.   

    sp.Parity = Parity.Odd; 
    sp.Parity = Parity.Mark;//Even 
    Parity是可以自己计算的,把接收到字节判别一下1的个数。
      

  3.   

    校验位在接受到的每个字节中,是由USART硬件产生的,当接收到该字节时送到累加器A中,这时A的奇偶位就是该字节校验位
      

  4.   

    要获取校验位,在API层次无法实现,可能需要自己写串口驱动。
      

  5.   

          sp.Parity = Parity.Odd; 
          sp.Write(b, 0, 1); 
          sp.Parity = Parity.Mark; 
          sp.Write(b, 1, 1); 
    你这里最大的编程问题是由于你擅自修改效验方式,而又不通知对方。
    那么对方的程序在接收第一个数据后,即使是依照你的想法更改了效验,也很有可能收不到数据。
    主要原因是:发送和接收的时间不对称。
    LZ你这种实现,应该属于无效验、自适应的通讯协议。
    这种协议最典型的特点就是发送和接收脱离,发送数据后,根本没有考虑对方是否有正常接收,也不接收对方的返回,非常容易出现通讯不对称的情况,而造成通讯失败。
    最少到目前位置,我还没有见过比较成功这样的通讯协议应用。LZ你这样的应用方式我们的系统有应用,但不是采用你这样的发送方式,我们通过制定数据协议,通过请求=应答机制在通讯的过程临时改变通讯效验位。
      

  6.   

    楼上的朋友说的很有道理,校验方式不断变更确实不好
    但是问题还是没有解决呀,假设我整个数据块都用Odd校验,下位机方还是要获得校验位才行期待能有API层的解决方法,如果如lfchen 所说必须自己写驱动,就没有办法了
      

  7.   

    // 在PC上:下位机(串口2,8位数据,无校验!)
    int CheckParity(char bits7)
    {
    __asm
    {
    XOR EAX,EAX;=0
    ADD AL,bits7;
    JNP IsOdd
    }
    return 0;
    IsOdd:
    return 1;
    }
    //
    void TestParity(void)
    {
    int ret;
    char bin[40];
    for (unsigned char kk=0;kk<128;kk++)//7 bits data
    {
    itoa(kk,bin,2);
    int rest=8-strlen(bin);
    strrev(bin);
    for(int jj=0;jj<rest;jj++)
    {
     strcat(bin,"0");
    }
    strrev(bin);
    ret=CheckParity(kk);
    afxDump << kk << "=" << bin << " Parity= " << (ret ? "Odd" : "Even") << "\n";
    Sleep(80);
    }
    }
    //结果:
    0=00000000 Parity= Even
    1=00000001 Parity= Odd

    15=00001111 Parity= Even
    16=00010000 Parity= Odd
    17=00010001 Parity= Even
      

  8.   

    LZ所说的下位机,看你是用的是什么,我作过PIC单片机的程序,只要设置校验位的寄存器值为奇或是偶校验后,由硬件自动产生,自动判断。如果校验位不对,则产生一个校验位错误的中断。在中断内可以做处理。
    PIC单片机中八位单片机不支持硬件校验位,需要通过设置接收方式为9位数据接收,把第9位做为校验位,自已计算并比较。我在写WINCE程序时,也发现一个问题,利用win 32API,不能产生带校验位的数据,即不能向外发送含有校验位的数据,接收时,把具有校验位的数据自动去除了校验位。请教各位如何解决.