跪求 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这也是不知道为何) 跪求!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
谢谢!!!
现因为工作需求,进日急需搞定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这也是不知道为何) 跪求!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
谢谢!!!
估计没法联系厂家。 国内的代理商没一个懂这个的,。
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,
所以应该不是硬件问题。 曾经有人告诉我用System.BitConverter .ToString(byte[] arr)先进行转换数据。 但是得出的数据结果和现有的结果没什么差别.
和厂家联系啊
一般厂家都提供2次开发的dll
你可以用串口监视软件对串口监视,通过运行设备自带的通信软件来监视其发送和接受的所有命令,就可以了解到具体的通信协议了。
只能这样说,小鬼子对传输过来的数据加了密,我现在真的猜不到用什么方法加的密
还有就是波特率,流控制开关.看看这些设置.通常这种情况都是设置不匹配导致的
你可以写个串口调试器测试下.还有,如果要使用SerialPort的话,尽量不要用char[]接收
C#里它受127限制,至少我使用的时候是.