跪求 COM 通信的解决方法.!!!!!!!!!!!!!!!(SOS,大侠帮忙呀!!) 
现因为工作需求,进日急需搞定pc与com设备的通信问题. 如有那位大侠能帮其解决或提示,在下感激不尽。   该com设备有自己的通信协议. 
通信过程如下:     com设备   -------->  发送 ENQ到          主机 
    com设备   <--------  发送 ACK确认        主机 
    com设备   ------->  发送Header Text      主机 
    com设备   <-------- 发送 ACK确认        主机 
    com设备   ------> 发送正文内容           主机 
    com设备   <-------- 发送 ACK确认         主机 
    com设备   ------> 发送EOT                主机 
    com设备   <---------- 发送 ACK确认       主机 
c# 代码如下:     try 
         { 
            mcc._CommPort=1; 
            if(mcc.PortOpen) mcc.PortOpen=false; 
            mcc.RThreshold=1; 
            mcc.Settings="9600,n,8,1"; 
            mcc.InputMode=MSCommLib.InputModeConstants.comInputModeBinary; 
            mcc.InputLen=0; 
            mcc.NullDiscard=false; 
            mcc.OnComm+=new MSCommLib.DMSCommEvents_OnCommEventHandler(mcc_OnComm); 
             mcc.PortOpen=true; 
         } 
         catch(Exception err) 
         { 
            MessageBox.Show(err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information); 
         } private void ProccessData(byte[] s) 
      { 
                   
        foreach(byte b in s) 
         { 
            this.richTextBox1.AppendText(b.ToString("X")+","); 
         } 
         this.richTextBox1.AppendText("\n"); 
         mcc.Output="0X06"; 
       
                
                   
      }       private void Form1_Load(object sender, System.EventArgs e) 
      {    
         i=0; 
         mcc=new MSCommClass(); 
          
       
      }       private void timer1_Tick(object sender, System.EventArgs e) 
      { 
         if(i++>=30 && mcc.InBufferCount<=0) 
         { 
            this.timer1.Stop(); 
            MessageBox.Show("未连接,已超时!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information); 
          
             
            mcc.PortOpen=false; 
            this.Close(); 
         } 
          
                   }       private void mcc_OnComm() 
      { 
         if(mcc.InBufferCount>0) 
         { 
            ProccessData((byte[])mcc.Input); 
         } 
      } 
问题:      c#编写的程序能正常运行,也可以接收到com设备的数据。 但是接收到的数据和com设备说明上的数据格式完全不一样。  比如com设备先要发送 ENQ请求建立连接,但是在主机端收到的ENQ请求值与ENQ本身的ASCII码值不一(接收到的是0XF9,而ENQ值是0x05. 这不知道为何) 如果按照com设备的通信说明理解(com设备在传输数据时是先从二进制低位开始传输,比如00000001,它的传输方式是 10000000) 它发送的ENQ(0X05 [二进制:00000101])在接收端时应该是(0xa0 [二进制:10100000]) 才对呀。   接收到的数据参考: F9  (第一行就是ENQ请求) 
58,5A,69,EE,8,8,84,4A  (第二行是header文本) 
4A,AA,7A,5A,D8 (第三行也是header文本) 
F9  (第四行按道理是EOT值, 但是在这里接收到的还是 F9这也是不知道为何) 跪求!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
谢谢!!! 

解决方案 »

  1.   

    设备是日本电装公司的. 机器是DENSO BHT8000 的盘点机。
    估计没法联系厂家。 国内的代理商没一个懂这个的,。
      

  2.   

    回楼上兄弟:    我试过n遍,始终没有找到规律。 以下是一些接收到的数据 (要传送的文件是111.txt,文件是空的,连续四次都是对同一文件操作的,前提文件没有任何改变的情况下进行的。第一行应该是指的ENQ请求,第二行应该说的是文件名,第三行应该说的是文件容量信息,第四行是EOT结束请求。)第一次接收到的。FE,
    58,5A,E9,EE,8,88,48,4A,
    4A,4A,7A,5A,38,
    F9,第二次接收到的。
    F9,
    58,5A,E9,2,8,8,C8,4A,
    4A,4A,86,5A,D8,
    F9,
    第三次接收到的。F9,
    58,5A,69,EE,8,8,84,4A,
    4A,EA,7A,5A,D8,
    F9,
    第四次接收到的
    F9,
    58,DA,E9,EE,8,84,48,4A,
    CA,4A,7A,5A,20,
    F9,
      

  3.   

    回楼上的兄弟。 我通过com设备自带的通信软件相同的文件传输没有出现任何问题。 我的c#程序中com1端口设置为波特率是9600,无奇偶校验,数据位8位,停止位1位. 与com设备的设置完全一样。
    所以应该不是硬件问题。 曾经有人告诉我用System.BitConverter .ToString(byte[] arr)先进行转换数据。 但是得出的数据结果和现有的结果没什么差别.
      

  4.   

    你的是什么设备啊??
    和厂家联系啊
    一般厂家都提供2次开发的dll
      

  5.   

    回楼上兄弟:   这个厂商是日本的,他们只提供了用户手册与相关技术文档. 而我的开发就是通过他们提供的资料进行的, 但很不幸的是. 他们提供的技术文档与com设备工作时传输的数据格式对不起来.. 真让人摸不着头脑.
      

  6.   

    也可能在数据传输之前在com设备上加密数据了???
      

  7.   

    jxpxwym(莫名悲痛):我通过com设备自带的通信软件相同的文件传输没有出现任何问题。
    你可以用串口监视软件对串口监视,通过运行设备自带的通信软件来监视其发送和接受的所有命令,就可以了解到具体的通信协议了。
      

  8.   

    用com监视软件,检验下日本鬼子给你的协议参考说明是否正确,日本人小聪明
      

  9.   

    回楼上兄弟, 按照小日本的pdf文档说明和实际接收到数据是完全不同的。 
    只能这样说,小鬼子对传输过来的数据加了密,我现在真的猜不到用什么方法加的密
      

  10.   

    同意楼上判断
    还有就是波特率,流控制开关.看看这些设置.通常这种情况都是设置不匹配导致的
    你可以写个串口调试器测试下.还有,如果要使用SerialPort的话,尽量不要用char[]接收
    C#里它受127限制,至少我使用的时候是.
      

  11.   

    最近也在做COM软件,不过是vb6,这个是需要设备厂商来协助测试的
      

  12.   

    谢谢楼上众位兄弟的好心帮助. 在下已经找到小日本的DLL文件了, 不过小日本也太狠了. 居然这个dll文件也要卖钱.. 真是愤怒.....