c#进行com口编程无法收到响应数据

CharlesLee1120 2014-08-11 03:15:18
现要对PMAC725多功能电表进行串口编程,获取响应数据并解析, 通过com调试工具发送010300000001840A十六进制数据可获取响应01 03 02 56 42 07 D5,但通过自己写的程序可以发送, 无法获取响应.

结果:


附源码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;

namespace SerialPortDemo
{
class Test2
{
private SerialPort comm = new SerialPort();
private StringBuilder builder = new StringBuilder();//避免在事件处理方法中反复的创建,定义到外面。
private long received_count = 0;//接收计数
private long send_count = 0;//发送计数

public Test2()
{

comm.PortName = "com11";
comm.BaudRate = 9600;
comm.StopBits = StopBits.One;
comm.DataBits = 8;
comm.Parity = Parity.None;
comm.NewLine = "\r\n";


//添加事件注册
comm.DataReceived += new SerialDataReceivedEventHandler(comm_DataReceived);
comm.Open();
}

void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
received_count += n;//增加接收计数
comm.Read(buf, 0, n);//读取缓冲数据
builder.Clear();//清除字符串构造器的内容
//因为要访问ui资源,所以需要使用invoke方式同步ui。

//判断是否是显示为16禁止

//依次的拼接出16进制字符串
foreach (byte b in buf)
{
builder.Append(b.ToString("X2") + " ");
}

//追加的形式添加到文本框末端,并滚动到最后。
Console.WriteLine(builder.ToString());
//修改接收计数
Console.WriteLine("Get:" + received_count.ToString());

}

void sendData(string data)
{
//定义一个变量,记录发送了几个字节
int n = 0;
List<byte> buf = new List<byte>();//填充到这个临时列表中
foreach (byte item in data)
{
buf.Add(item);
}
//转换列表为数组后发送
comm.Write(buf.ToArray(), 0, buf.Count);
//记录发送的字节数
n = buf.Count;
send_count += n;//累加发送字节数
}
void close()
{
comm.Close();
}
static void Main(string[] args)
{
Test2 t = new Test2();
try
{

while (true)
{
Thread.Sleep(3000);
Console.WriteLine("发送数据");
t.sendData("010300000001840A");
}
}
finally
{
t.close();

}
}
}
}
...全文
221 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
CharlesLee1120 2014-08-12
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
[quote=引用 5 楼 a4005000 的回复:] [quote=引用 3 楼 Z65443344 的回复:] t.sendData("010300000001840A"); 老老实实定义个byte数组,把内容填进去,不要自己胡转乱转
你好,调用void sendData(string data)方法时, 内部转换为byte数组了. [/quote] 看2楼,你转错了. foreach里,你把每一个字符都转byte,于是你发送的是00,01,00,03.... 你应该每2个字符转byte[/quote] 感谢大神, 可以获取到响应了.非常感谢.
CharlesLee1120 2014-08-12
  • 打赏
  • 举报
回复
引用 8 楼 mjp1234airen4385 的回复:
你这中t.sendData("010300000001840A");发送的数据是: bdata[0] = 0x30; bdata[1] = 0x31; bdata[2] = 0x30; bdata[3] = 0x33; bdata[4] = 0x30; bdata[5] = 0x30; . . . bdata[14] = 0x30; bdata[15] = 0x41; 你这是发送了16个长度,而不是8个长度。
感谢大神, 可以获取到响应了.非常感谢.
mjp1234airen4385 2014-08-11
  • 打赏
  • 举报
回复
你这中t.sendData("010300000001840A");发送的数据是: bdata[0] = 0x30; bdata[1] = 0x31; bdata[2] = 0x30; bdata[3] = 0x33; bdata[4] = 0x30; bdata[5] = 0x30; . . . bdata[14] = 0x30; bdata[15] = 0x41; 你这是发送了16个长度,而不是8个长度。
mjp1234airen4385 2014-08-11
  • 打赏
  • 举报
回复
二楼的意思是: byte[] bdata = new byte[8]; bdata[0] = 0x01; bdata[1] = 0x03; bdata[2] = 0x00; bdata[3] = 0x00; bdata[4] = 0x00; bdata[5] = 0x01; bdata[6] = 0x84; bdata[7] = 0x0A; comm.Write(bdata.ToArray(), 0, bdata.Count);
於黾 2014-08-11
  • 打赏
  • 举报
回复
引用 5 楼 a4005000 的回复:
[quote=引用 3 楼 Z65443344 的回复:] t.sendData("010300000001840A"); 老老实实定义个byte数组,把内容填进去,不要自己胡转乱转
你好,调用void sendData(string data)方法时, 内部转换为byte数组了. [/quote] 看2楼,你转错了. foreach里,你把每一个字符都转byte,于是你发送的是00,01,00,03.... 你应该每2个字符转byte
CharlesLee1120 2014-08-11
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
t.sendData("010300000001840A"); 老老实实定义个byte数组,把内容填进去,不要自己胡转乱转
你好,调用void sendData(string data)方法时, 内部转换为byte数组了.
CharlesLee1120 2014-08-11
  • 打赏
  • 举报
回复
引用 1 楼 Cnwanglin 的回复:
t.sendData("010300000001840A"); 你发送的是字符串,可不是 16进制数字 同时,程序可以发送,对方能够接受到这个字符串
你好,调用void sendData(string data)方法时, 内部转换为byte数组了.
於黾 2014-08-11
  • 打赏
  • 举报
回复
t.sendData("010300000001840A"); 老老实实定义个byte数组,把内容填进去,不要自己胡转乱转
於黾 2014-08-11
  • 打赏
  • 举报
回复
字符串转16进制错误 01 03 分别是一个字节 不能把string转char数组,然后再转 那样变成0,1,0,3分别当做字节在发送
Cnwanglin 2014-08-11
  • 打赏
  • 举报
回复
t.sendData("010300000001840A"); 你发送的是字符串,可不是 16进制数字 同时,程序可以发送,对方能够接受到这个字符串

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧