我想 下位机 发一条命令,命令格式如下:FEFEFEFE6801000101B1053c000000000016命令在“串行调试助手“ 上调试通过,我发此命令,“串行调试助手” 原样返回。下位机使用的是 BCD 码,每次都发送失败(在控件上不返回任何内容)。
static void Main() 
{
Application.Run(new Form1());
} private void Form1_Load(object sender, System.EventArgs e)
{
if(this.axMSComm1.PortOpen==false)
{
  this.axMSComm1.PortOpen=true;
  this.axMSComm1.RThreshold=35;
}
} private void cmdSend_Click(object sender, System.EventArgs e)
{
this.axMSComm1.Output="FEFEFEFE6801000101B1053c000000000016"; //发送数据
this.axMSComm1.InBufferCount=0;
} private void axMSComm1_OnComm(object sender, System.EventArgs e)
{
if(this.axMSComm1.CommEvent==2)
{
this.label3.Text=this.axMSComm1.Input.ToString();//接收数据
}
}

解决方案 »

  1.   

    接收数据后要解码才可赋值给label3.Text,编码的问题.
      

  2.   

    可是 我发的命令 下位机无法解析,也就是说,我发的命令 是 string 型的,也就是说是 asc 码,下边是 使用 BCD 码,而不是 FEFEFEFE6801000101B1053c000000000016  ,
    该如何转换呀.
      

  3.   

    现在把以前所学得都忘光了,一查bcd,原来这么简单,如果你上面的是16进制数的话,可以如下:
    string strData = "FEFEFEFE6801000101B1053C000000000016";
    string strOutPut = "";
    string strTemp;
    for( int i = 0; i < strData.Length; i++ )

    int nCurrent = Convert.ToInt16( strData[i].ToString(), 16 );
    strTemp = Convert.ToString( nCurrent, 2 );
    strTemp = strTemp.PadLeft( 4, '0' );
    strOutPut += strTemp;
    }
    // Send data using "strOutPut"
      

  4.   

    Knight94(愚翁) :
    我 在 .net 中使用的是 vb 的 msComm 组件,现在将 this.axMSComm1.InputMode 的属性 设为 1 ,程序无法启动 ,报错如下:无法将类型 “int” 隐式转换为 “MSCommLib.InputModeConstants”未能找到引用的组件 “AxgrproLib”。未能加载类型库。库没有注册。未能找到引用的组件 “grdesLib”。未能加载类型库。库没有注册。我尝试着进行 组件注册,按照如下方式进行:
    /*************
    在.net 2003光盘下面有目录Extras\VB6 Controls此目录包含 Visual Basic 6.0 的 dbgrid32.ocx 控件和一个包含所有 VB 6.0 控件授权信息的注册表文件:VB6Controls.reg,包含所有 VB 6.0 控件设计时的授权信息。若想在 .NET 中使用 Visual Basic 6.0 的控件,你可以通过 RegEdit.exe 将 .reg 中的控件注册信息添加到你的注册表中,从而注册这些控件。
    具体操作:运行Regedit.exe  -> 文件 -> 导入 -> 选择VB6Controls.reg, 完成.*************/
    但是注册时 Regedit  程序提示 已成功导入。启动 .net 程序却启动不起来。帮助分析一下。
      

  5.   

    看上面的提示,加上很久以前使用vb的印象来判断,是你vb库安装不全造成的,建议你把vb几个基本的运行库都进行安装,然后再试试。
      

  6.   

    我试了一下,vb 重装了还是不行。我刚才看到“字符串要转换成字节数组才能进行通信”,另外,我把 协议标准 给你发一下,你看一下我做的哪里有问题,谢谢!!!/***************************参照DL/T645-1997《多功能表通信规约》
    通讯参数:
    默认:2400BPS,8位数据,1位停止位,无奇偶校验。无握手。发送和接收以二进制形式进行。
    链路层
    本协议为主-从结构的半双工通信方式。主站为上位机管理中心,从站为各种采集器,每个采集器均有各自的地址编码。通信链路的建立与解除均由主站发出的信息帧来控制。每帧由帧起始符、从站地址域、控制码、数据长度、数据域、帧信息纵向校验码及帧结束符等7个部分组成。每部分由若干字节组成。
    前导自节:在发信息帧之前,先发送4字节的FEH,以唤醒接收方。
    起始符:68H,标识一帧信息的开始。
    控制码:用于识别不同的命令。
    结束符:16H,标识一帧信息的结束。
    数据长度:为数据域长度,即数据的字节数。
    校验码:从帧起始符到校验码之前的所有字节的CRC8位校验码。
    传输次序:所有数据项均先传送高字节,后传低位字节。
    一般应接受命令信息帧和答信息帧数据长度一致。说明 代码 字节数
    帧起始符 68H 1
    地址域 A0-A3(A0采集器分类号、A1A2为编号、A3端口号即表号)  4
    控制码 CS 1
    数据长度域 L 1
    数据域 DATA N
    校验码 CS 1
    结束符 16H 1地址域:A0A1A2为在采集器中的识别号,A3根据现场访问的表号决定。访问时若地址码为FFH、FFH、FFH,端口号任意,则认为是广播命令,所有采集器均响应,但无返回。
    每帧数据长度小于70bytes,数据大时可分帧发送。
    完整命令:帧起始符+地址域+命令格式+校验码+结束符
      

  7.   

    串口通信,没有真正研究过,你去www.codeproject.com找找例子,看看是否对你有帮助,以下是我找的
    http://www.codeproject.com/csharp/serialcommunication.asp
      

  8.   

    我看了以下,里面讲的是 .net framework 2.0 , vs2005 的。可我用的是 vs 2003, FCL 没串口通信 类。
      

  9.   

    没注意,那你看看这篇
    http://www.codeproject.com/dotnet/DotNetComPorts.asp
      

  10.   

    更改mscomm的发送模式为二进制
    申明一个数组byte[] sendByte = {0xFE,0xFE,0xFE,0xFE,0x68,0x01,0x00,0x01,
                       0x01,0xB1,0x05,0x3C,0x00,0x00,0x00,0x00,
                       0x00,0x16};axMSComm1.Output = sendByte;按上面修改即可.
    你这是电力的一个协议,我以前做过,呵呵,叫什么645协议还是什么,记不起来啦,呵呵?
      

  11.   

    to  commandown(它山之石) 成功了。
    太感谢了!!!!!!!