功能需求:
有一个药柜,药柜上有36个LED灯,需要实现上位机发送指令个药柜控制器实现亮灯和灭灯操作。协议说明:
1、采用RS-232C格式通讯。控制字写入COMx口,其中x为RS-232C/RS-485转换器所接入的上位机标准串行接口。
2、串行通讯波特率为9600,1个bit起始位,8个bit数据,一个bit停止位。
3、上位机控制指令格式为2字节,其中第一个字节为节点编号,即为药柜编号;第二个字节为该药柜的灯编号及灯的"亮"和"灭"指令。两字节格式如下:
第一字节:
D7 D6 D5 D4 D3 D2 D1 D0
8bit全部为药柜编号,编号范围是1-127(01H-7FH)号。第二个字节:
D7 D6 D5 D4 D3 D2 D1 D0
D7控制灯的"亮"或"灭",D7=1,灯亮,D7=0,灯灭。
D6-D0为药柜的灯编号,范围是1-127(01H-7FH)。
例如:10000100B表示编号为04的灯亮,00000011B表示编号为03的灯灭。4、上位机自己的RS-485协议编号为00H。5、下位机(药柜控制器)在接到上位机控制指令后,即回复一个2字节的指令。
第一个字节:00H(上位机编号),呼叫上位机。
第二个字节:上位机传给该药柜控制器的第二字节指令。6、上位机发出控制指令后,即等待下位机(药柜控制器)回复,若接收到的第一字节为00H,第二字节等于本机所发的第二字节,则表示控制指令传输成功。######################################################################################################按照上面描述的规则,我写了一段通讯代码,发送过去指令对应LED灯不会亮,通讯是成功的,应该是指令发送代码不正确,请各位有经验的大虾指点一下,应该如何写发送这两个字节的代码。自己写的一段代码:
serialPortDemo.PortName = "COM2";
serialPortDemo.BaudRate = 9600;
serialPortDemo.DataBits = 8;
serialPortDemo.Parity = Parity.Mark;
serialPortDemo.StopBits = StopBits.One;
serialPortDemo.Open();//转换药柜和药柜灯字节模式
serialPortDemo.WriteLine("00000001 00111111");serialPortDemo.Close();*******************************************************************************************************
可用分只有78了,不好意思。

解决方案 »

  1.   

    serialPortDemo.WriteLine("00000001 00111111");
    ==========================>byte[] b = new byte[2];
    b[0] = 1;
    b[1] = 63;//如果要开,则为63+0x80
    serialPortDemo.Write(b, 0, 2);试一下
      

  2.   

    serialPortDemo.WriteLine("00000001 00111111");你这发送的是字节? 我怎么看着象是字符串啊。这是17个字节?
      

  3.   

    serialPortDemo.PortName = "COM2";
    serialPortDemo.BaudRate = 9600;
    serialPortDemo.DataBits = 8;
    serialPortDemo.Parity = Parity.Mark;
    serialPortDemo.StopBits = StopBits.One;
    serialPortDemo.Open();
    //10000100B表示编号为04的灯亮,00000011B表示编号为03的灯灭。
    //04灯亮 转化为16进制 0x84,03灯灭转化为16进制为0x03
    byte[]Request=new byte[2];
    Request.Add((byte)0x84);
    Request.Add((byte)0x03);
    serialPortDemo.Write(Request,0,2);
      

  4.   

    建议楼主用accessport先自己组帧通讯一下,组帧没问题,在编码吧