我这里写的串口通信程序(一) 这个串口通信程序,测试了只能够自发自收,假如我用单片机发数据就收不到了,?问:这个只是适合自发自收吗?
SerialPort sp = new SerialPort();
private void btn1_Click(object sender, EventArgs e)
{
sp.PortName = "COM3";
sp.BaudRate = 9600;
sp.Open();
byte[] data = Encoding.Unicode.GetBytes(re.Text);
string str = Convert.ToBase64String(data);
sp.WriteLine(str);
MessageBox.Show("数据发送成功", "系统提示");
} private void btn2_Click(object sender, EventArgs e)
{
byte[] data = Convert.FromBase64String(sp.ReadLine());
tr.Text = Encoding.Unicode.GetString(data);
sp.Close();
MessageBox.Show("数据接收成功", "系统提示");
(二)这个是用事件触发的,但是用单片机发数据在revtext.Text上接受不到,问?为什么?
}
System.IO.Ports.SerialDataReceivedEventArgs 将导致该该事件被触发; private void mycomm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int DataLength = mycomm.BytesToRead;//获取接受缓冲区中数据的字节数
int i = 0;
StringBuilder strb = new StringBuilder();
while (i < DataLength)
{
byte[] dbs = new byte[2048];
int len = mycomm.Read(dbs,0,2048);//每次从输入缓冲区中读取2048个字节,并将这些字节写入到dbs[]数组中
strb.Append(ASCIIEncoding.GetEncoding("gb2312").GetString(dbs, 0, len));
i += len;
}
revtext.Text += strb;// revtext.Text 将显示接收到的数据
}(三)这个与上面类似,用单片机可以实现发数据,在界面上接收,但是收到的是乱码?问:为什么?
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ int DataLength = serialPort1.BytesToRead;
int i = 0;
StringBuilder strb = new StringBuilder();
while(i<DataLength )
{
byte[] dbs = new byte[14];
int len = serialPort1.Read(dbs, 0, 14);
RevAppend(ASCIIEncoding.GetEncoding("gb2312").GetString(dbs, 0, len));
i += len;
} void RevAppend(string str)
{
if (textBox1.InvokeRequired)
this.Invoke(new MethodInvoker(delegate
{
textBox1.AppendText(str); ;
textBox1.SelectionStart = int.MaxValue;
textBox1.SelectionLength = 1;
textBox1.ScrollToCaret();
}));
else
{
textBox1.AppendText(str);
textBox1.SelectionStart = int.MaxValue;
textBox1.SelectionLength = 1;
textBox1.ScrollToCaret();
}
}
最后,请问下,有那位大侠,可以帮忙分析下,这一二三直接的区别和联系,已经修改的方法、
SerialPort sp = new SerialPort();
private void btn1_Click(object sender, EventArgs e)
{
sp.PortName = "COM3";
sp.BaudRate = 9600;
sp.Open();
byte[] data = Encoding.Unicode.GetBytes(re.Text);
string str = Convert.ToBase64String(data);
sp.WriteLine(str);
MessageBox.Show("数据发送成功", "系统提示");
} private void btn2_Click(object sender, EventArgs e)
{
byte[] data = Convert.FromBase64String(sp.ReadLine());
tr.Text = Encoding.Unicode.GetString(data);
sp.Close();
MessageBox.Show("数据接收成功", "系统提示");
(二)这个是用事件触发的,但是用单片机发数据在revtext.Text上接受不到,问?为什么?
}
System.IO.Ports.SerialDataReceivedEventArgs 将导致该该事件被触发; private void mycomm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int DataLength = mycomm.BytesToRead;//获取接受缓冲区中数据的字节数
int i = 0;
StringBuilder strb = new StringBuilder();
while (i < DataLength)
{
byte[] dbs = new byte[2048];
int len = mycomm.Read(dbs,0,2048);//每次从输入缓冲区中读取2048个字节,并将这些字节写入到dbs[]数组中
strb.Append(ASCIIEncoding.GetEncoding("gb2312").GetString(dbs, 0, len));
i += len;
}
revtext.Text += strb;// revtext.Text 将显示接收到的数据
}(三)这个与上面类似,用单片机可以实现发数据,在界面上接收,但是收到的是乱码?问:为什么?
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{ int DataLength = serialPort1.BytesToRead;
int i = 0;
StringBuilder strb = new StringBuilder();
while(i<DataLength )
{
byte[] dbs = new byte[14];
int len = serialPort1.Read(dbs, 0, 14);
RevAppend(ASCIIEncoding.GetEncoding("gb2312").GetString(dbs, 0, len));
i += len;
} void RevAppend(string str)
{
if (textBox1.InvokeRequired)
this.Invoke(new MethodInvoker(delegate
{
textBox1.AppendText(str); ;
textBox1.SelectionStart = int.MaxValue;
textBox1.SelectionLength = 1;
textBox1.ScrollToCaret();
}));
else
{
textBox1.AppendText(str);
textBox1.SelectionStart = int.MaxValue;
textBox1.SelectionLength = 1;
textBox1.ScrollToCaret();
}
}
最后,请问下,有那位大侠,可以帮忙分析下,这一二三直接的区别和联系,已经修改的方法、
还有你要看单片机的通讯说明 发送的数据格式都要准确才行 特别是校验位要计算准确