c# - 串口连续数据读取
问题描述
我已经使用 WPF 制作了应用程序,我必须实现串行通信。贝娄我有 DataReceived 功能。
主要问题是该函数仅在某些时候触发,是否有人对 WPF 中的 DataReceived 触发器有更好的解决方案?
下面是连接到 ComPort 的连接
public static void connnect(string recPort)
{
System.Windows.Threading.DispatcherTimer MyTimer = null;
bool error = false;
String serialpname = recPort;
ComPort = new SerialPort();
if (ComPort.IsOpen == false)
{
ComPort.PortName = serialpname;
ComPort.BaudRate = 38400;
ComPort.Parity = Parity.None;
ComPort.DataBits = 8;
ComPort.StopBits = StopBits.One;
ComPort.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived);
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick += dispatcherTimer_Tick;
dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
try
{
if (ComPort.IsOpen == false)
{
//Open Port
ComPort.Open();
dispatcherTimer.Start();
}
}
catch (System.IO.IOException) { error = true; }
}
}
下面是询问端口的定时器
private static void dispatcherTimer_Tick(object sender, EventArgs e)
{
try
{
ComPort.Write(eot + "11" + STX + "2170" + ENQ); // get pos
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
数据接收事件
public static void OnSerialDataReceived(object sender,
SerialDataReceivedEventArgs args)
{
bool isString = true;
try
{
Thread.Sleep(100);// this solves the problem
byte[] readBuffer = new byte[ComPort.ReadBufferSize];
int readLen = ComPort.Read(readBuffer, 0, readBuffer.Length);
string readStr = string.Empty;
if (isString)
{
readStr = Encoding.Default.GetString(readBuffer, 0, readLen);
if(readStr.Length > 10)
{
if (readStr.StartsWith("\u0002"))
{
Position = (Mid(readStr, 2, 5));
Messenger.Default.Send("NewPos");
}
else
{
Position = (Mid(readStr, 31, 4));
Messenger.Default.Send("NewPos");
}
}
}
else
{
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < readLen; i++)
{
stringBuilder.Append(readBuffer[i].ToString("X2") + " ");
}
readStr = stringBuilder.ToString();
}
}
catch (Exception ex)
{
Trace.TraceError(ex.Message);
Console.WriteLine(ex);
}
}
解决方案
问题解决了,我添加了一个 Thread.Sleep(100); 在 datareceived 函数中。缓冲区没有填满传入的数据,这似乎是原因。谢谢你。
推荐阅读
- javascript - 如何在 javascript 的 sublime text 3 中获取用户的输入?
- docker - 如何代理 docker compose 容器?
- r - 使用 dplyr group_split 保留数据帧名称
- linux - 写入文件时如何确定页面(缓存)边界
- android - 自动将私有应用程序发送给客户端
- workflow - 用于管理传入文件处理的工作流平台
- jq - 使用 JQ 将 json 转换为表会出现“无法索引字符串错误”
- java - 如何在使用“spring”语言扩展swagger-codegen生成的接口的spring控制器中使用枚举作为参数
- python - 姜戈。对链中的对象进行排序
- react-native - 条纹handlecardsetup不是本机反应的功能吗?