在写个程序,想通过PC的串口控制一台仪器(电压供应器)进行操作(操作步骤:先将仪器设成远程控制模式---》再将仪器输出状态设为ON ---》最后读取仪器的输出电压及电流值),因为该仪器输出的为TTL电平信号,所以仪器是通过配套的一根TTL-RS232通讯电缆连接到PC串口的,连接好后,我先用从网上下载的一个串口调试器来调试了一下,在字符串输入框输入命令:AA002001000000000000000000000000000000000000000000CB,选择Hex发送,然后点击发送按钮,仪器就能被设置成远程控制模式,然后再发送命令AA002101000000000000000000000000000000000000000000CC,就能如愿的把仪器输出状态设为ON。但是我在c#程序中,我分别使用过Write(string)以及WriteLine(string)等方法来发送如上命令,仪器却无任何反应,程序是显示发送成功的。
请问大侠们,会是什么原因?
我用Write("AA002001000000000000000000000000000000000000000000CB"),
WriteLine("AA002001000000000000000000000000000000000000000000CB"),
请问大侠们,会是什么原因?
我用Write("AA002001000000000000000000000000000000000000000000CB"),
WriteLine("AA002001000000000000000000000000000000000000000000CB"),
解决方案 »
- 一段C#代码,求改错
- C#如何自绘椭圆形按钮
- 给gridview传值的问题
- Server.MapPath在类中打不出来
- 用C#建的FTP服务器 可以用RealMedia控件播放里面的文件
- GDI+画图问题
- 如何清除上网痕迹,包括表单的输入历史记录等
- 安装dotFrameWork的时候提示:stup can not access windows installer component;操作系统是xp个人版,请高手帮忙,急死了!!!!!!
- 请教高手:xml字符串写回dataset对象的问题!
- WPF,要显示一张gif图片就这么难吗?
- 找各位高手求解,C#调用fortran编写的DLL 出现的问题
- 如何在浏览出错的时候客户端发出警报声
给段示例说明下吧(下次回复快速点,不然直接无视你这个问题帖了。): /// <summary>
/// 普通方法——字符串转字节数组,最容易想到
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static byte[] StringToBytes(string input)
{
int len = input.Length;
if (len % 2 != 0)
{
throw new Exception("输入的字符串长度有误,必须是偶数。");
}
byte[] bytes = new byte[len / 2];
for (int i = 0; i < len / 2; i++)
{
if (!byte.TryParse(input.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber, null, out bytes[i]))
{
throw new Exception(string.Format("在位置{0}处的字符无法转换为16进制字节", i * 2 + 1));
}
}
return bytes;
} /// <summary>
/// 普通方法——字节数组转字符串,最容易想到
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string BytesToString(byte[] input)
{
StringBuilder sb = new StringBuilder();
foreach (byte b in input)
{
sb.Append(b.ToString("X2"));
}
return sb.ToString();
}
byte[] bytes = StringToBytes("AA002001000000000000000000000000000000000000000000CB");
serialPort.Write(bytes, 0, bytes.Length);
通过RS232-485转接头转换,用C++调用WriteFile可以正常通信,用C#就不行
分析可能是因为转接时只用了2个针脚,而C#的用了其他针脚。但是对硬件不是很熟悉吗,不能确定
[0x00000000] 0xaa
[0x00000001] 0x00
[0x00000002] 0x20 ...
我有些不明白,这并没有转换成字节呀?正常的话,转换成字节后,数组中第一个元素应该是170,第二个0...
怎么回事???晕了,会不会是我程序选择的编码有问题?
你首先将格式的16进制数据:AA002001000000000000000000000000000000000000000000CB,转换为字符串,然后再将转换好的字符串发送出去就OK了
是不是我理解有误?我觉得把AA002001...这个16进制数据转换成字节型数组后,数组里面应该是{170,0,32,1...}。
{170,0,32,1...}这是int[]
{0xaa,0x00,0x20,...}这是byte[]
两者在数值上相等,不是可以byte b = (byte)170;吗?结果就是0xaa没作用的话,检查其它地方是否有误,别老钻在一个方面,说不定你还有其它错误,例如这么长的数据中是否少个0,SerialPort的属性设置是否正确。
传递过去出错,说明就是你发送的问题。
问题解决了,是serialPort控件的问题,我换成MSComm控件,发送同样的命令,就可以控制仪器,汗颜...!