C#中最快的串行端口通信?

C#中最快的串行端口通信?,c#,serial-port,C#,Serial Port,我是这个论坛的新成员,在C#编程方面没有太多经验。我用C#构建了一个简单的Windows应用程序,以便与朋友给我的电子板进行通信。他将微控制器中的串行端口波特率定义为38400。我想通过串行端口尽可能快地发送和接收字节。使用C#中现有的serialport工具,我只能读取字节,但即使在自己的线程中使用eventhandler,速度仍然不够快。我的缓冲区[4096]在几秒钟内就满了 我的问题是,是否存在其他一些用于串行端口通信的功能或工具,这些功能或工具不会占用太多处理器时间。我需要在不到200个

我是这个论坛的新成员,在C#编程方面没有太多经验。我用C#构建了一个简单的Windows应用程序,以便与朋友给我的电子板进行通信。他将微控制器中的串行端口波特率定义为38400。我想通过串行端口尽可能快地发送和接收字节。使用C#中现有的serialport工具,我只能读取字节,但即使在自己的线程中使用eventhandler,速度仍然不够快。我的缓冲区[4096]在几秒钟内就满了

我的问题是,是否存在其他一些用于串行端口通信的功能或工具,这些功能或工具不会占用太多处理器时间。我需要在不到200个字节内读取一个字节。我在嵌入式系统方面有更多的经验,这不是一个问题

谢谢大家的建议或想法


谢谢你的回复。我可以读取来自电路板的所有字节,但回复速度不够快。这是我的密码。我使用了一个事件来读取缓冲区。如果我试图在事件中回复,则下一个字节包含错误的值

#region namespace usings
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO;
using System.IO.Ports;
using System.Threading;
using System.Runtime.InteropServices;
using System.Diagnostics;

using Microsoft.Win32;
using Zaber.Serial.Core;
using Diagnostics = System.Diagnostics;
#endregion
名称空间火灾应用 {

公共部分类表单1:表单
{
int k=1;
字节的字符串数;
字节校验和;
字节[]缓冲区=新字节[11];
byte[]buffer_old=新字节[11];
公共表格1()
{
初始化组件();
configure_button.Enabled=false;
启动按钮。已启用=错误;
foreach(SerialPort.GetPortNames()中的字符串s)
{
串行端口名称。项目。添加;
}
serial\u port\u name.Text=“选择端口”;
对于(int i=4800;i请查看:

Ben Voigt(作者)给出了一个关于如何使用
SerialPort
的固有
BaseStream
成员的极好示例,该成员对于使用底层Win32 API更为有效

Port = new SerialPort("COM" + PORT_NUMBER.ToString()); 
...
private void ReadEvent()  
{      
    byte[] buffer = new byte[2000];  
    Action kickoffRead = null;  
    kickoffRead = (Action)(() => Port.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate(IAsyncResult ar)  
    {  
        try  
        {  
            int count = Port.BaseStream.EndRead(ar);  
            byte[] dst = new byte[count];  
            Buffer.BlockCopy(buffer, 0, dst, 0, count);  
            RaiseAppSerialDataEvent(dst);  
        }  
        catch (Exception exception)  
        {  
            MessageBox.Show(ERROR == > " + exception.ToString());    
        }  
        kickoffRead();  
    }, null)); kickoffRead();  
}

注意。

你能发布你的代码吗?你的应用程序应该没有理由不能双手绑在背后蒙着眼睛处理38400。每字节200us是5000bps-在38400baud时,你的速度几乎是你所述要求的十倍。问题是延迟而不是吞吐量吗?另请参见:.38400非常快,你可以y 119200,但电路板也需要设置为该波特率。PC和电路板都必须匹配波特率。@Baddack布线和环境噪声也很重要-速率越快,电缆需要越好,噪声容忍度越低。我有一个(电噪声)系统由于这个原因,在9600波特运行的工业环境中,即使是38400波特,它们也会开始随机丢弃字节。在进行任何类型的开发时,我通常会尽可能以9600波特的速度编写和调试硬件,直到一切都建立起来并开始工作。然后,您可以开始提高速度(在操作环境中)直到您遇到问题。这不是Vishal的代码,而是我的代码(除了第一行和MessageBox调用)。请更新您的态度,讽刺的是,这篇正确的原始博客文章在4年前就链接到了这个问题的评论中。。。
Port = new SerialPort("COM" + PORT_NUMBER.ToString()); 
...
private void ReadEvent()  
{      
    byte[] buffer = new byte[2000];  
    Action kickoffRead = null;  
    kickoffRead = (Action)(() => Port.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate(IAsyncResult ar)  
    {  
        try  
        {  
            int count = Port.BaseStream.EndRead(ar);  
            byte[] dst = new byte[count];  
            Buffer.BlockCopy(buffer, 0, dst, 0, count);  
            RaiseAppSerialDataEvent(dst);  
        }  
        catch (Exception exception)  
        {  
            MessageBox.Show(ERROR == > " + exception.ToString());    
        }  
        kickoffRead();  
    }, null)); kickoffRead();  
}