c# 串口 如何知道IO已经发送完成

问题描述

C#通过serialPort.write发送一串数据【字符串1】,要在这一串数据发送完成之后延时20毫秒,继续发送另一串数据【字符串2】请问一下有什么方法可以知道串口已经将【字符串1】发送完成?

解决方案

解决方案二:
可以判断发送数据的那个事物是否已经完成,如果整个过程完成的话数据也应该发完了。
解决方案三:
好像没有办法检测发送数据是否完成,或者数据是否被客户端接收,因为I/O下位机通讯,能做的就是把数据扔进通信通道,是否接收到,只能靠通讯协议,下位机返回数据来看
解决方案四:
你们都不遵守通讯协议的吗?
解决方案五:
最好是有通讯协议,简单点就是用一个特殊字符表示结束当然也可以用间隔时间为条件,但不是很稳定,最好相隔几百毫秒以上,接收方在一定时间内没有新数据就表示数据结束了.
解决方案六:
可以根据波特率计算一下发送指定数据需要的时间t,调用serialPort.write后延时(t+20)ms试试
解决方案七:
通讯协议是有的。第一帧是唤醒帧,下位机对唤醒帧是不响应的。等到唤醒帧发送完延迟一段时间就是真正的数据帧,下位机对数据帧是有响应的。现在的问题是不知道第一帧数据是什么时候发完的,如果在serialPort.write()后延时一段时间,感觉这个延时是没用的。
解决方案八:
那你的通讯协议是有毛病的,不能修改了吗?下位机对唤醒帧是不响应的这是不对的,如果下位机出现故障你也发送数据帧吗?握手过程是必须要有的
解决方案九:

解决方案十:
你要这么整,那就要与下位机有这样的一个协议ReqAskReqAsk
解决方案十一:
协议没问题的,按照MODBUS协议来的。
解决方案十二:
下位机对唤醒帧没响应,其余帧都是响应的。C#没有类似于单片机的串口发送中断吗?通讯协议目前是不能改了的。

时间: 2024-09-17 11:03:24

c# 串口 如何知道IO已经发送完成的相关文章

c语言-VC++6.0开发工具,打开串口,重叠IO操作,提示有访问冲突,求大神指点

问题描述 VC++6.0开发工具,打开串口,重叠IO操作,提示有访问冲突,求大神指点 #include #include LRESULT CALLBACK WndProc (HWND hwnd UINT msg WPARAM wParam LPARAM lParam); #define WM_TRANSFINISHED (WM_USER + 1) typedef struct{ HWND hwnd; HANDLE hComm;}PARAMS *PPARAMS; int WINAPI WinMai

串口通信-串口调试助手可以发送十六进制和字符串,如果发送的命令是ascii怎么办呢,

问题描述 串口调试助手可以发送十六进制和字符串,如果发送的命令是ascii怎么办呢, 字符串和ascii是不一样的把,怎么可以让单片机和一个支持串口通信的设备通信,哪个设备只能接收ascii,我用单片机发送给他的时候,应该是什么格式呢,ascii码一位即可,命令是23...9就这样的,单个数字 解决方案 ascii是字符编码,字符编码构成的序列称之为字符串.你作为上位机,把字符串分为一个一个字符逐个发给它就可以了. 解决方案二: int i = 2;char a = (char)('0' + i

串口通信-wpf System.IO.IOException

问题描述 wpf System.IO.IOException 最近在尝试用C# wpf做串口通信,在电脑睡眠唤醒后出现如下异常,在电脑没有进入睡眠前运行都正常,代码中Rec函数是单独的接收线程,有没有高手帮忙看一下是什么原因引起的异常 解决方案 睡眠了,串口不工作了.发送方的不到回复,出错了. 不要让机器休眠.

C# 使用serialPort,在Timertick里使用串口发送数据,同时再接收串口数据,发生冲突

问题描述 RT,有没有办法互不干扰,我的TimerTick设置的是200ms 解决方案 解决方案二:说清楚什么干扰,只能理解为你处理的不好解决方案三:解释一下,接收使用_DataRecevied事件,并不是在Timer_Tick中解决方案四:引用1楼bdmh的回复: 说清楚什么干扰,只能理解为你处理的不好 具体情况是,接收事件触发不了privatevoidtimer_CheckPLC_Tick(objectsender,EventArgse){ModbusRegisterRead_1(726);

求助,定时发送串口消息问题

问题描述 问题描述:我在开发winform的串口收发程序中,发送串口指令的部分指令发送的事件间隔不准,一开始以为是在线程中做这个线程间时间片的分配问题,所以改成form的定时器,发现问题仍然存在.不求非常精确,只求能做到同样事件间隔看起来没有什么差别. 解决方案 解决方案二:form的定时器是不太准的,用System.Threading.Timer,不过注意这个定时器是多线程的解决方案三:一些不应该在主线程操作的费时操作,从主线程中去掉,那么你的串口操作间隔就可以"非常准"的.因为主线

PC通过5个串口给下位机发送命令并取会数据。这5个可以分别不受干扰的进行吗?

问题描述 PC通过5个串口给下位机发送命令并取会数据.这5个可以分别不受干扰的进行吗?这是不是就是多线程? 解决方案 解决方案二:当然可以,他们有各自的接收过程,不过为了一个接收时,不阻塞主进程,可以使用线程对每个串口进行管理解决方案三:引用1楼bdmh的回复: 当然可以,他们有各自的接收过程,不过为了一个接收时,不阻塞主进程,可以使用线程对每个串口进行管理 听起来好复杂.以前玩VB.没接触过多线程.解决方案四:有人会吗?解决方案五:可以将串口的业务流程封装成类,定义5个实例就好;或者简单点,每

java 串口通信

/** *//****************************************** * 程序文件名称:SendComm.java * 功能:从串行口COM1中发送数据 ******************************************/ import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.comm.*; class S_Fra

vb.net 串口读取操作造成死机

问题描述 vb.net 串口读取操作造成死机 VB.net串口操作,timer定时发送,程序运行一段时间之后,界面死机,程序停止在serialport.read 这一行,这段程序在datareceived接收事件中,并且已设置ReceivedBytesThreshold属性,readtimeout 设置再大(1000.2000.3000)都不管用,如何处理这个错误让串口继续工作? 解决方案 可试试创建一个线程,和对应的进度事件代理和错误信息事件代理,长时间的io操作不应该和ui处于相同的线程,那

asp.net C#串口通信详解

标准DLL,可以采用DllImport进行调用.例如:  代码如下 复制代码   [DllImport("KMY350X.dll")]         private static extern int OpenPort(int PortNum, int BaudRate); 如果一些厂家比较懒的话,没有提供相应的dll,我们只能对它进行串口通信编程了.以前从没接触过串口编程,最近在一个项目中有几个地方都需要采用串口通信,跟公司一个老手请教后,感觉学到了很多东西,特在此做个总结: