串口调试,发送接收数据问题

xnyun1207 2013-09-10 12:50:36
我做一个串口调试助手,想练习串口数据的发送,用的是VS自带的serialport控件,发送数据和接收数据程序如下,接收数据时候,乱码:如图
测试程序如下,主要指点串口的接收部分
private void button3_Click(object sender, EventArgs e) //发送数据
{
try
{
if ( txtSendMessage.Text=="")
{
MessageBox.Show("发送信息为空", "消息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
else
{
if (spSend.IsOpen == true)
{
byte[] data = Encoding.Unicode.GetBytes(txtSendMessage.Text);
string str = Convert.ToBase64String(data);
spSend.Write(str);
}
else
{
MessageBox.Show("串口没有打开", "消息提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}

}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
}
private void spReceive_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (spReceive.IsOpen == false) //如果串口关闭的,那么返回
return;
try
{
IsRecieve = true;
int n = spReceive.BytesToRead; //获得接收缓冲区的字节数
if (n < 1)
{
IsRecieve = false;
return;
}
byte[] buf = new byte[n];//声明一个临时数组用来存放当前来的串口数据,长度由读取到的字节决定
spReceive.Read(buf, 0, n);//读取缓冲区数据

rhbReceive.Invoke(new EventHandler(delegate
{
rhbReceive.Text = Encoding.UTF8.GetString(buf);
}));
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return;
}
finally
{
Listening = false;

}
}
...全文
242 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yss9170 2013-09-11
  • 打赏
  • 举报
回复
串口的波特率一定要一致,且收发的编码方式要一致。
xnyun1207 2013-09-10
  • 打赏
  • 举报
回复
引用 8 楼 u011303459 的回复:
[quote=引用 6 楼 xnyun1207 的回复:] [quote=引用 3 楼 u011303459 的回复:] 1.string str = Convert.ToBase64String(data);这句话多余了。SerialPort可以直接传byte[]。即使你想用string参数,用txtSendMessage.Text就行了。 2.发送和接收的编码不一致。发送是Encoding.Unicode,接收是Encoding.UTF8
如果我按照你说的,直接发送部分: byte[] data = Encoding.Unicode.GetBytes(txtSendMessage.Text); //将发送的内容编码成一个发送的字符序列 //string str = Convert.ToBase64String(data); //spSend.Write(str); spSend.WriteLine(data); //发送数据 会报错:错误 参数“1”: 无法从“byte[]”转换为“string” 与“System.IO.Ports.SerialPort.WriteLine(string)”最匹配的重载方法具有一些无效参数 [/quote] //发送byte[] spSend.Write(data,0,data.Length);[/quote] 发送函数可以这样写: byte[] data = Encoding.Unicode.GetBytes(txtSendMessage.Text); //将发送的内容编码成一个发送的字符序列 spSend.Write(data,0,data.Length); 那么接收函数,应该怎么写呢,我的是这样的: byte[] data = Convert.FromBase64String(spReceive.ReadLine()); rhbReceive.Invoke(new EventHandler(delegate { rhbReceive.Text = Encoding.UTF8.GetString(data); })); 结果说超时,但是我不想用这种接收方法:我想用, IsRecieve = true; int n = spReceive.BytesToRead; //获得接收缓冲区的字节数 if (n < 1) { IsRecieve = false; return; } byte[] buf = new byte[n];//声明一个临时数组用来存放当前来的串口数据,长度由读取到的字节决定 spReceive.Read(buf, 0, n);//读取缓冲区数据 接下来我就不会处理了
feiniao19830822 2013-09-10
  • 打赏
  • 举报
回复
引用 6 楼 xnyun1207 的回复:
[quote=引用 3 楼 u011303459 的回复:] 1.string str = Convert.ToBase64String(data);这句话多余了。SerialPort可以直接传byte[]。即使你想用string参数,用txtSendMessage.Text就行了。 2.发送和接收的编码不一致。发送是Encoding.Unicode,接收是Encoding.UTF8
如果我按照你说的,直接发送部分: byte[] data = Encoding.Unicode.GetBytes(txtSendMessage.Text); //将发送的内容编码成一个发送的字符序列 //string str = Convert.ToBase64String(data); //spSend.Write(str); spSend.WriteLine(data); //发送数据 会报错:错误 参数“1”: 无法从“byte[]”转换为“string” 与“System.IO.Ports.SerialPort.WriteLine(string)”最匹配的重载方法具有一些无效参数 [/quote] //发送byte[] spSend.Write(data,0,data.Length);
howema 2013-09-10
  • 打赏
  • 举报
回复
检查波特率设置对了没有
xnyun1207 2013-09-10
  • 打赏
  • 举报
回复
引用 3 楼 u011303459 的回复:
1.string str = Convert.ToBase64String(data);这句话多余了。SerialPort可以直接传byte[]。即使你想用string参数,用txtSendMessage.Text就行了。 2.发送和接收的编码不一致。发送是Encoding.Unicode,接收是Encoding.UTF8
如果我按照你说的,直接发送部分: byte[] data = Encoding.Unicode.GetBytes(txtSendMessage.Text); //将发送的内容编码成一个发送的字符序列 //string str = Convert.ToBase64String(data); //spSend.Write(str); spSend.WriteLine(data); //发送数据 会报错:错误 参数“1”: 无法从“byte[]”转换为“string” 与“System.IO.Ports.SerialPort.WriteLine(string)”最匹配的重载方法具有一些无效参数
xnyun1207 2013-09-10
  • 打赏
  • 举报
回复
引用 1 楼 fangwei198712 的回复:
rhbReceive.Text = Encoding.UTF8.GetString(buf); 试试其他的编码格式
试了,不过如果把发送部分改为: spSend.WriteLine(str); //发送数据 而且接收部分,上面 都去掉 只要byte[] data = Convert.FromBase64String(spReceive.ReadLine()); 结果可以显示,好奇怪,给解释
blwuer 2013-09-10
  • 打赏
  • 举报
回复
引用 3 楼 u011303459 的回复:
1.string str = Convert.ToBase64String(data);这句话多余了。SerialPort可以直接传byte[]。即使你想用string参数,用txtSendMessage.Text就行了。 2.发送和接收的编码不一致。发送是Encoding.Unicode,接收是Encoding.UTF8
正解
feiniao19830822 2013-09-10
  • 打赏
  • 举报
回复
1.string str = Convert.ToBase64String(data);这句话多余了。SerialPort可以直接传byte[]。即使你想用string参数,用txtSendMessage.Text就行了。 2.发送和接收的编码不一致。发送是Encoding.Unicode,接收是Encoding.UTF8
bdmh 2013-09-10
  • 打赏
  • 举报
回复
你确认是Unicode编码?
偶是菜鸟 2013-09-10
  • 打赏
  • 举报
回复
rhbReceive.Text = Encoding.UTF8.GetString(buf); 试试其他的编码格式
串口监控器是一个免费的多功能串口通讯监控软件,它能够多种方式显示,接收,分析通讯数据;能够以多种灵活方式发送数据;功能强大,操作简便,在串口通讯监控,设备通讯测试中,能够有效提高工作效率。 主要功能如下: 接收数据: 1. 以十六进制方式显示接收到的数据。 2. 以字符方式显示接收到的数据。 3. 数据帧自动识别,分行显示。 4. 接收数据自动换行设置。 5. 显示或隐藏数据帧的接收时间。 6. 自动清除,自动保存接收到的数据。 7. 接收数据个数计数。 发送数据: 1. 十六进制方式发送数据。 2. 字符串方式发送数据。 3. 发送“发报窗口”当前光标行的数据帧。 4. 循环发送“发报窗口”当前光标行的数据帧。 5. 循环发送“发报窗口”固定行的数据帧。 6. 循环依次发送“发报窗口”的多行数据帧。(设置起始行,行数) 7. 触发发送,接收到“发报窗口”某一行数据,触发发送“发报窗口”另一行数据。 8. 发送数据个数计数。 实用增强功能: 1. 强大易用的进制转换功能。 2. 智能识别当前光标处数据帧的行号,“字符”或“十六进制数”的个数。 3. 智能计算当前选择的“字符”或“十六进制数”的个数。 4. 强大的数据查找功能。 5. 定时保存,定时清除数据。 6. 根据自己的喜好,灵活变换操作界面。 应用场合: 1. 截取和分析设备之间通讯数据流。 2. 串行外围设备硬件开发。 3. 串行设备驱动程序开发。 4. 调试和测试设备和设备之间的串行通讯过程。 5. 记录和分析RS232/422/485通信过程。 6. 模拟某设备通讯过程,对另外设备进行通讯测试。

111,097

社区成员

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

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

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