关于串口通信的上位机 都写完了 但是总出现接收数据跳0的情况 用串口助手测试没问题 但是接到单片机的数据包就有问题 目前还没找到解决办法 拜求各位大神

小学工 2017-07-09 12:17:03
我把全部代码贴出来 新手代码比较low 虚心请教



public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); // 这里主要是显示的form里的实时时间 用的委托
new Thread(() =>
{
while (true)
{
try { shijian.BeginInvoke(new MethodInvoker(() => shijian.Text = DateTime.Now.ToString("HH:mm tt"))); }
catch { }
try { shijian2.BeginInvoke(new MethodInvoker(() => shijian2.Text = DateTime.Now.ToString("yyyy/MM/dd dddd"))); }
catch { }

Thread.Sleep(1000);
}
})
{ IsBackground = true }.Start();
}





private void button2_Click(object sender, EventArgs e)
// 这里使用button按钮向单片机发送数据包,单片机接收到后开始给上位机发送数据
{

byte[] xxx = new byte[4];
xxx[0] = 0x11;
xxx[1] = 0x22;
xxx[2] = 0x33;
xxx[3] = 0x44;
serialPort1.Write(xxx, 0, 4);

}





private void Form1_Load(object sender, EventArgs e)
// 这里是显示的页面,我把页面贴出图片
{
Form2 frm = new Form2();
frm.ShowDialog();


CheckForIllegalCrossThreadCalls = false;
string[] ports = SerialPort.GetPortNames( );
comboBox1.Items.AddRange(ports);

if (ports.Length == 0)
{
MessageBox.Show("没有可用串口", "系统提示");
}
else
{
SerialPort serialPort1 = new SerialPort();

}
}








private void button1_Click(object sender, EventArgs e)
//这个button控件打开comboBox1中的串口名 ,如果没打开报出错误
{

if (comboBox1.Text == null)
{
MessageBox.Show("请打开串口", "系统提示", MessageBoxButtons.YesNoCancel);
}


if (serialPort1.IsOpen == false)
{
button1.Text = "打开串口";
serialPort1.PortName = comboBox1.Text.ToString();
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = 9600;


try
{
serialPort1.Open();
MessageBox.Show("串口已打开!", "系统提示");

}
catch (Exception ex)
{
//serialPort1 = new SerialPort();
MessageBox.Show(ex.Message);

}
}
else
{
button1.Text = "串口已打开";
}



}









private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
/*这段是触发了控件的接收事件,开始接收数据 解析数据包 我感觉就是这里出了问题接收上来的数据会有挺长时间的延迟 还会时不时的显示0.0 这种情况感觉不应该出现 不想显示0.0 但出现这种情况的时候要让他显示上一个数据*/
{
SerialPort serialPort1 = sender as SerialPort;
byte[] shuju = new byte[serialPort1.ReadBufferSize];

serialPort1.Read(shuju, 0, shuju.Length);


if (shuju[0] == 0x5A)
{


if (shuju[5] == 0x01)
{

{

label8.Text = ((double)(shuju[6] * 256 + shuju[7]) / 10).ToString("f1");

}
}



if (shuju[5] == 0x03)
{

{

label9.Text = ((double)(shuju[6] * 256 + shuju[7]) / 10).ToString("f1");

}
}




if (shuju[5] == 0x05)
{

{

label10.Text = ((double)(shuju[6] * 256 + shuju[7]) / 10).ToString("f3");

}
}

}





...全文
675 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
小学工 2017-07-09
  • 打赏
  • 举报
回复
谢谢各位大佬 不吝赐教
  • 打赏
  • 举报
回复
相比之下,定时显示时间时滥用线程的问题不算是什么大问题。主要是分包、粘包处理这才是最基本的通讯模式问题。
  • 打赏
  • 举报
回复
这种程序删除了重新开发吧。 DataReceived 没有处理分包和粘包逻辑,有个业务处理之后应该才触发什么显示事件(而不是搞什么while死循环、Sleep 1000 卡顿操作)。 这说明还没有学会基本的编程设计模式。
小学工 2017-07-09
  • 打赏
  • 举报
回复
大神们多给点意见啊
小学工 2017-07-09
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
这种程序删除了重新开发吧。 DataReceived 没有处理分包和粘包逻辑,有个业务处理之后应该才触发什么显示事件(而不是搞什么while死循环、Sleep 1000 卡顿操作)。 这说明还没有学会基本的编程设计模式。
数据的接受和处理 不就是用触发serial的DataReceived事件么

110,534

社区成员

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

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

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