通过serial.Write发送串口命令问题? 如何知道这个硬件是否有响应,或者返回值什么的。要求发送三次,如果如任何响应,判断本次通信失败。。这个如何做啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用 sscomm32 先发收命令试通先。 wuyazhe 能否详细点?谢谢了 http://blog.csdn.net/wuyazhe/category/695097.aspx通讯协议你要先了解好。用 sscomm32 先发收命令试通先。你搜索一下,这是个串口调试工具。 mervyn807 通过什么判断有没有返回值啊?请教了 用的是线程 + while(true) 循环 发送队列实现的我想每发送一条命令 等待有结果了,在执行下一条命令。 回复 10楼: 这不是网口,这是串口,socket好像不行吧 回复 11楼: 你发送命令后,立刻读取串口返回数据,设定一个超时时间,如果在超时时间内没有返回值,或则返回错误值就再次循环,否则就break。 int length = mycomm.BytesToRead;byte[] data = new byte[length];for (int i = 0; i < length; i++){ data[i] = (byte)mycomm.ReadByte();}这个就是读取串口返回数据 把data转换成相应类型就可以了 串口属性里面有个ReadTimeOut就是设定超时时间的 多少时间内没有读取到数据就判断失败 回复14楼:就是这个意思下面是我写的代码。如何设定??// 从命令队列取出命令并发送 while (true) { if (CommandList.Count > 0) { Command command = null; object lockHelper = new object(); lock (lockHelper) { command = CommandList[0]; SendedCommandList.Add(command); CommandList.RemoveAt(0); } try { serial.Write(command.CommandText); // 记录日志:发送命令成功 CMMLog.Info(string.Format("HardwareAccessObject:" + CMMDefine.CONSTANTS_MSG_SEND_COMMAND, EquipmentID, command)); } catch (Exception ex) { // 记录日志:发送命令失败 CMMLog.Error(string.Format("HardwareAccessObject:" + CMMDefine.CONSTANTS_MSG_SEND_COMMAND_FAILURE, EquipmentID, command)); } } try { Thread.Sleep(5); } catch (Exception ex) { // 记录日志:线程Sleep异常 CMMLog.Error("HardwareAccessObject:" + CMMDefine.CONSTANTS_MSG_THREAD_SLEEP_FAILURE + "\\n" + ex.StackTrace); } } 可以在这里面读取串口返回数据 睡线程的话就可以不用设定超时时间了 判断int length = mycomm.BytesToRead; 的值 如果是0 就是没有返回值就继续线程 不是0就把值转换出来进行判断 try { Thread.Sleep(5); } catch (Exception ex) { // 记录日志:线程Sleep异常 CMMLog.Error("HardwareAccessObject:" + CMMDefine.CONSTANTS_MSG_THREAD_SLEEP_FAILURE + "\\n" + ex.StackTrace); } } 接16楼的代码 :发送命令的队列里面有很多对多个硬件的访问命令,一个硬件又有多个命令要执行发送。比如:OPEN GET STATUS 两条命令不知道如何去做对所有设备的返回结果了如何解决这个问题啊!头疼。 C#我该怎么把我灰度好的图片背景由黑色变成白色呢? 急!怎么在打包程序的时候把oracle.msi也打包进去? 小弟新手!请问高手这个函数什么意思! 仔细说说 C#转VB.NET问题,解决了马上揭帖,谢谢! 有广州的吗?想找个人教用C#做ASP.net 求C#中有关SQL SERVER中存取各种类型的文件方法。 谁有ASP.NET(c#)底层知识题目及答案 webForm中DataGrid如何响应双击事件? C#怎么判断数组对象类型? 想实现一个鼠标画正方形的功能,求思路。 vs 2005 c#调用vc写的.dll的问题 根据在浏览器中输入的地址,获得IP
谢谢了
通讯协议你要先了解好。
用 sscomm32 先发收命令试通先。
你搜索一下,这是个串口调试工具。
请教了
我想每发送一条命令 等待有结果了,在执行下一条命令。
这不是网口,这是串口,socket好像不行吧
你发送命令后,立刻读取串口返回数据,设定一个超时时间,如果在超时时间内没有返回值,或则返回错误值就再次循环,否则就break。
byte[] data = new byte[length];
for (int i = 0; i < length; i++)
{
data[i] = (byte)mycomm.ReadByte();
}这个就是读取串口返回数据 把data转换成相应类型就可以了
串口属性里面有个ReadTimeOut就是设定超时时间的 多少时间内没有读取到数据就判断失败
while (true)
{
if (CommandList.Count > 0)
{
Command command = null;
object lockHelper = new object(); lock (lockHelper)
{
command = CommandList[0];
SendedCommandList.Add(command);
CommandList.RemoveAt(0);
} try
{
serial.Write(command.CommandText); // 记录日志:发送命令成功
CMMLog.Info(string.Format("HardwareAccessObject:" + CMMDefine.CONSTANTS_MSG_SEND_COMMAND, EquipmentID, command));
}
catch (Exception ex)
{
// 记录日志:发送命令失败
CMMLog.Error(string.Format("HardwareAccessObject:" + CMMDefine.CONSTANTS_MSG_SEND_COMMAND_FAILURE, EquipmentID, command));
}
} try
{
Thread.Sleep(5);
}
catch (Exception ex)
{
// 记录日志:线程Sleep异常
CMMLog.Error("HardwareAccessObject:" + CMMDefine.CONSTANTS_MSG_THREAD_SLEEP_FAILURE + "\\n" + ex.StackTrace);
}
}
判断int length = mycomm.BytesToRead;
的值 如果是0 就是没有返回值就继续线程 不是0就把值转换出来进行判断
try
{
Thread.Sleep(5);
}
catch (Exception ex)
{
// 记录日志:线程Sleep异常
CMMLog.Error("HardwareAccessObject:" + CMMDefine.CONSTANTS_MSG_THREAD_SLEEP_FAILURE + "\\n" + ex.StackTrace);
}
}
发送命令的队列里面有很多对多个硬件的访问命令,一个硬件又有多个命令要执行发送。
比如:OPEN GET STATUS 两条命令
不知道如何去做对所有设备的返回结果了如何解决这个问题啊!头疼。