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"); } }
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) { } }
/// <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); }