C#实现串口通讯的上位机程序,需要和下位机进行频繁的数据交互

Danny_hi 2019-03-19 09:23:02
最近要写一个上位机程序,需要和下位机进行频繁的数据交互:
比如说上位机和下位机通过串口连接好之后,
上位机向下位机发送一段特殊字符,下位机收到后反馈上位机一段特殊字符,如果上位机没收到,则上位机重新发送这段字符,等待下位机反馈;后续还有很多这种类似的交互,交互的字符也不一样,怎么实现比较好啊,谢谢
...全文
1305 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2019-03-27
  • 打赏
  • 举报
回复
唉,一个劲强调“握手”

我们得说,见鬼的“握手”

这里是应答。

前面都已经告诉你了

请求(发送消息,最好带上sessionid)
.应答(接受所有消息,判定是否是同一个sessionid)
.超时(如果到达指定时间无应答丢出超时处理)
.重试(这里我第一个回复已经告诉你,别人已经封装好了策略级方法)


我们不能给你代码,因为你看到了,这是一整套东西,不是几句话的东西。你看明白了自己弄
cxg821031 2019-03-27
  • 打赏
  • 举报
回复
心跳包要有的吧?
Danny_hi 2019-03-26
  • 打赏
  • 举报
回复
引用
https://blog.csdn.net/misslxy/article/details/82849193
参考一下,这个基本上很全面了,我之前刚做了一个上位机


你这个是写串口助手啊,不是这么简单的问题。
这个握手的逻辑怎么实现?上位机收不到回复继续发送握手信号怎么实现呢?
我现在采用定时器实现的,但是感觉没有预期的效果好!
诗和远方C 2019-03-26
  • 打赏
  • 举报
回复
https://blog.csdn.net/misslxy/article/details/82849193
参考一下,这个基本上很全面了,我之前刚做了一个上位机
mk_lucifer 2019-03-25
  • 打赏
  • 举报
回复
写网络通讯,切记要有明确的协议规范,你这种含糊其辞的东西,写通讯只会晕头转向。。。
mk_lucifer 2019-03-25
  • 打赏
  • 举报
回复
首先要有协议,自己定的都行,有固定格式,然后再讨论数据流交互。。。你应该了解下网络7层协议的意义。。。其实你想说的是如何写一个链路层协议而已。。。 最常见的 起始符+帧编号+总长度+数据域+校验码+结尾符。。。 你只要收到 帧编号相同的应答就能判断是否被应答。。。。RS232是全双功的 甚至可以连续发十条不用等待, 然后批处理应答就行了。。。
Danny_hi 2019-03-25
  • 打赏
  • 举报
回复
在用C#写一个上位机程序,用的是C#自带SerialPort控件,通信是没问题的。但是通信的逻辑要求:每次通信都是有上位机发起的握手信号,下位机接收到信息后判断是不是自己信息,如果是则发送数据,否则不发送数据。如果上位机没收到数据,则要继续发送握手信号。。。。请问这个逻辑C#怎么实现啊?这个握手的逻辑怎么实现?上位机收不到回复继续发送握手信号怎么实现呢?,谢谢大家了。
  • 打赏
  • 举报
回复
不是技术问题,是基本的业务逻辑。
  • 打赏
  • 举报
回复
引用 13 楼 Danny_¥%#* 的回复:
这个握手的逻辑怎么实现?上位机收不到回复继续发送握手信号怎么实现呢?
裸机上,上位机是怎么判断“收不到信号”的呢?
Danny_hi 2019-03-25
  • 打赏
  • 举报
回复
起始符+帧编号+总长度+数据域+校验码+结尾符
你说的这个我当然知道了,我就是用这个格式发送和接收的;
我问的是:
这个握手的逻辑怎么实现?上位机收不到回复继续发送握手信号怎么实现呢?
groveer 2019-03-19
  • 打赏
  • 举报
回复
串口接收数据是在另一个线程,发送你就做个定时器判断发送好了哇
Danny_hi 2019-03-19
  • 打赏
  • 举报
回复
数据发送格式都已经设定好了,我用的就是SerialPort,需要用定时器来重复发送和接收下位机的数据吗,有什么好的逻辑吗,谢谢
groveer 2019-03-19
  • 打赏
  • 举报
回复
串口通信接收数据需要做个延时,一般看数据量大小和下位机的发送方式,然后如果只是简单的通信,就做帧头帧尾和校验位,如果比较复杂,还需要控制位,这些协议你自己去跟下位机定好
wanghui0380 2019-03-19
  • 打赏
  • 举报
回复

task v= 指令.send().Retry(重试条件,重试次数)

你这个东西是一整套的,我们只能告诉你最后是这么个结果。

策略机制实际上有人包装过
https://www.cnblogs.com/SteveLee/p/microservice_polly.html

当然我们只是给你指路,你要做的事情还有很多。最起码命令编码和解码你要自己来,串口发送你要自己来。发送命令队列,解码命令队列你要自己来
qq14923349 2019-03-19
  • 打赏
  • 举报
回复
用现成的串口类阿 调试用串口助手模拟发 看收发是否一致
江湖评谈 2019-03-19
  • 打赏
  • 举报
回复
SerilPort 串口控件
jx315425246 2019-03-19
  • 打赏
  • 举报
回复


private static SerialPort com = new SerialPort();

private void read_write_com()
{
int buf_num;
byte[] m1 = { 0x01,0X02,0X03,0X04 };
byte[] rsbuf = new byte[64];
com_1 = int_com("COM1", 9600, 8, 2, 0);
com_1.Open();

com_1.ReadTimeout = 1000;
com_1.WriteTimeout = 1000;
while(true)
{
com.DiscardInBuffer();
com.DiscardOutBuffer();
com.Write(m1, 0, m1.Length);
buf_num = com.Read(rsbuf,0,64);
if(buf_num>0)
{
}
}

}


public SerialPort int_com(string com, int bt, int sj, int jo, int tz)
{
SerialPort s_com = new SerialPort();
s_com.PortName = com;
s_com.BaudRate = bt;
s_com.DataBits = sj;
switch (jo)
{
case 0:
{
s_com.Parity = Parity.Even;
break;
}
case 1:
{
s_com.Parity = Parity.Odd;
break;
}
case 2:
{
s_com.Parity = Parity.None;
break;
}
case 3:
{
s_com.Parity = Parity.Mark;
break;
}
case 4:
{
s_com.Parity = Parity.Space;
break;
}
}

Danny_hi 2019-03-19
  • 打赏
  • 举报
回复
请帮忙回复一下具体的思路和逻辑,或者有没有遇到过类似的例子给我参考一下,谢谢!
平底锅锅锅 2019-03-19
  • 打赏
  • 举报
回复
自定义协议。

110,525

社区成员

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

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

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