我做一个串口调试助手,想练习串口数据的发送,用的是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;
}
}
测试程序如下,主要指点串口的接收部分
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;
}
}
解决方案 »
- Assembly.CreateInstance("XXX.XXX.XXXX")返回空,急求!!!
- C#2005 水晶报表(CrystalReports)
- 如何将x = "璇剧▼鐮旂┒锛屾伃渚洖澶?"转换为汉字串
- 如何取出用openFileDialog选定的文件名?不含路径?
- [深圳]找.NET高手,CSDN的5三角以上用户优-先.
- C#中怎么做像QQ好友上线提示从右下角冒出个气泡提示?
- 如何读取一个邮件中的附件内容?用什么类?高手请指点
- c#操作SQL 2008数据库
- 这样的功能是如何实现的
- 比较复杂的SQL语句怎么放入DataGrid中?
- C#整形之间的转换问题
- 如何改变GroupBox控件的边框颜色
试试其他的编码格式
2.发送和接收的编码不一致。发送是Encoding.Unicode,接收是Encoding.UTF8
而且接收部分,上面 都去掉 只要byte[] data = Convert.FromBase64String(spReceive.ReadLine());
结果可以显示,好奇怪,给解释
如果我按照你说的,直接发送部分:
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)”最匹配的重载方法具有一些无效参数
如果我按照你说的,直接发送部分:
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)”最匹配的重载方法具有一些无效参数
//发送byte[]
spSend.Write(data,0,data.Length);
如果我按照你说的,直接发送部分:
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)”最匹配的重载方法具有一些无效参数
//发送byte[]
spSend.Write(data,0,data.Length);发送函数可以这样写:
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);//读取缓冲区数据
接下来我就不会处理了