示例#1
0
 internal void closeAllChannel()
 {
     for (DevAddress devAddr = DevAddress.SWITCH_BOARD_0; devAddr <= DevAddress.SWITCH_BOARD_9; devAddr++)
     {
         command(devAddr, DevFunction.SET_SWITCH_CHANNEL, DevChannel.CH_ALL, "0");
     }
 }
示例#2
0
 public void SetDeviceId(string a)
 {
     try
     {
         a = a.Substring(0, 4);
         int num = (((Convert.ToInt16(a.Substring(0, 1)) * 0x1000) + (Convert.ToInt16(a.Substring(1, 1)) * 0x100)) + (Convert.ToInt16(a.Substring(2, 1)) * 0x10)) + Convert.ToInt16(a.Substring(3, 1));
         for (int i = 0; i < (identification.Length / 4); i++)
         {
             if (num == identification[i, 3])
             {
                 device_ID   = (deviceID)identification[i, 0];
                 device_Addr = (DevAddress)identification[i, 1];
                 return;
             }
         }
     }
     catch (Exception)
     {
     }
 }
示例#3
0
        /// <summary>
        /// 与设备通讯
        /// </summary>
        /// <param name="devAddr">设备地址</param>
        /// <param name="devFunc">设备功能</param>
        /// <param name="devCh">通道</param>
        /// <param name="data">数据</param>
        /// <returns>返回接受到的结果</returns>
        public string command(DevAddress devAddr, DevFunction devFunc, DevChannel devCh, string data)
        {
            write_log(new StackFrame(1).GetMethod().Name);
            if (ser == null)
            {
                MessageBox.Show("内部错误,无效的串口对象");
                //throw new Exception("内部错误,无效的串口对象");
            }
            mut.WaitOne();
            ser.Recive(1024, 1);    //clear rbuffer
            //WT 20170730
            //修改包头和包尾
            string cmdstr = String.Format(":{0}{1}{2}{3}{4}=",
                                          data.Length,
                                          ((char)devAddr).ToString(),
                                          ((char)devFunc).ToString(),
                                          ((char)devCh).ToString(),
                                          data);

            int trys = 3;

            while (trys-- > 0)
            {
                try
                {
                    write_log("send command: " + cmdstr);
                    ser.Send(cmdstr);
                    //WT 20170730
                    //添加80m延时
                    //对于获取测量结果的命令,发送数据是异步的。
                    //接收到命令后后会在约100 -200ms后完成采样和转换并回复结果.
                    //增大串口接收的字节数保证数据每次能被接收到(115200bps接收1000字节约需90ms)
                    Thread.Sleep(80);
                    string resstr = ser.ReciveString(1000);
                    write_log("recv result: " + resstr);
                    int         n    = resstr.IndexOf("#");             //检查开始字符
                    string      slen = resstr.Substring(n + 1, 1);      //获取长度
                    int         len  = int.Parse(slen);
                    DevAddress  addr = (DevAddress)(resstr[n + 2]);
                    DevFunction func = (DevFunction)(resstr[n + 3]);
                    DevChannel  ch   = (DevChannel)(resstr[n + 4]);
                    //WT 20170730
                    //不去判断通道回复是否一致
                    //在关闭某通道时,如果恰好是所有开关板都被关闭,会回复所有通道关闭
                    if (addr != devAddr || func != devFunc) //|| ch != devCh)      //判断回复是否一致
                    {
                        throw new Exception();
                    }
                    string res = len > 0?resstr.Substring(n + 5, len):""; //获取返回结果数据
                    string end = resstr.Substring(n + 5 + len, 1);        //检查结尾字符
                    if (end != "*")
                    {
                        throw new Exception();
                    }
                    mut.ReleaseMutex();
                    return(res);                 //成功返回
                }
                catch {
                    continue;
                }
            }
            mut.ReleaseMutex();
            throw new Exception("Device send command, but recive error, cmd: " + cmdstr);
        }