Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SerialPort.BaseStream.BeginWrite&;开头问题_C#_Asynchronous_Serial Port - Fatal编程技术网

C# SerialPort.BaseStream.BeginWrite&;开头问题

C# SerialPort.BaseStream.BeginWrite&;开头问题,c#,asynchronous,serial-port,C#,Asynchronous,Serial Port,我在尝试解决serialport对象上的异步通信时遇到了一些问题,希望得到一些帮助。我还在学习异步的东西,所以要温柔:) 我基本上需要确保在写入串行端口之前缓冲区没有满,并且在写入更多数据之前读取了所有数据,以避免数据包冲突。不幸的是,我正在编写的微控制器没有任何握手或CTSEnabled,因此我在代码中有tomimicit public partial class Form2 : Form { System.IO.Ports.SerialPort port = new System.

我在尝试解决serialport对象上的异步通信时遇到了一些问题,希望得到一些帮助。我还在学习异步的东西,所以要温柔:)

我基本上需要确保在写入串行端口之前缓冲区没有满,并且在写入更多数据之前读取了所有数据,以避免数据包冲突。不幸的是,我正在编写的微控制器没有任何握手或CTSEnabled,因此我在代码中有tomimicit

public partial class Form2 : Form
{
    System.IO.Ports.SerialPort port = new System.IO.Ports.SerialPort();
    System.Timers.Timer tmrPolling = new System.Timers.Timer(200);
    static byte [] inputPacket = new byte[2] { (byte)255, (byte)0 }; // Byte to send to SerialPort when input polling timer is activated.

    AsyncCallback callback;
    IAsyncResult result;

    Form2()
    {
        InitializeComponent();
        port.PortName = "COM9";
        port.BaudRate = 38400;
        port.DataBits = 8;
        port.StopBits = System.IO.Ports.StopBits.One;
        port.Parity = System.IO.Ports.Parity.None;
        port.ReadTimeout = 1;
        port.ReceivedBytesThreshold = 5;
        port.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived);
        callback = new AsyncCallback(ReadComplete);  
        port.ReadBufferSize = (byte)60;
        port.WriteBufferSize = (byte)60;
        port.Open();  
        tmrPolling.Elapsed += new System.Timers.ElapsedEventHandler(tmrPolling_Elapsed);
    }

    void WritePacket(byte[] packet)
    {
        result = port.BaseStream.BeginWrite(packet, 0, packet.Count(), callback, port); // writes the input packet to the SerialPort - needed to read the IO values
    }

    void ReadComplete(IAsyncResult result)
    {

    }


    void tmrPolling_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {  
        WritePacket(inputPacket); // writes the input packet to the SerialPort - needed to read the IO values
    }

    void port_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        port.BaseStream.EndWrite(result);
        // Reads the data coming in from the serial port and calls the thread safe delegate to update the values on the form.
        byte [] received = new byte[port.BytesToRead];
        result = port.BaseStream.BeginRead(received, 0, received.Count(), callback, port);
        port.BaseStream.EndRead(result);  
    }

    private void UpdateValues()
    {
        byte[] b = new byte[] { (byte)255, (byte)6, (byte)hsbPan.Value, (byte)vsbTilt.Value, (byte)0,  
        (byte)0, (byte)0, (byte)0, (byte)13, (byte)10 };
        WritePacket(b);
    }

    private void chkEnablePolling_CheckedChanged(object sender, EventArgs e)
    {  
        tmrPolling.Enabled = chkEnablePolling.Checked;
        test.Enabled = chkEnablePolling.Checked;
        vsbInputInterval.Enabled = chkEnablePolling.Checked;
        vsbInputInterval.Value = Convert.ToInt32(tmrPolling.Interval);
        txtInputInterval.Enabled = chkEnablePolling.Checked;
        txtInputInterval.Text = ((float)tmrPolling.Interval / ( float)1000).ToString() + " sec";
    }

    private void vsbInputInterval_Scroll(object sender, ScrollEventArgs e)
    {
        // adjusts the tick frequency of the Timer for input polling. 
        txtInputInterval.Text = ((float)tmrPolling.Interval / (float)1000).ToString() + " sec";
        tmrPolling.Interval = vsbInputInterval.Value;
    } 

    private void vsbTilt_Scroll(object sender, ScrollEventArgs e)
    {  
        UpdateValues();
    }

    private void hsbPan_Scroll(object sender, ScrollEventArgs e)
    {
        UpdateValues();
    }
}


也许采用生产者-消费者设计模式会有所帮助?看见