Ответы пользователя по тегу Последовательный порт
  • Как принять массив hex и вывести в textbox?

    @dark_Kelvin
    Событие DataReceived возникает в момент опроса порта (которое вероятно происходит каждый тик), если в буфере есть данные. Данные же в буфер пишутся асинхронно (по мере поступления).
    Поэтому, когда возникает событие DataReceived, в буфер могут ещё не успеть записаться все байты, для решения этой проблемы я делал так:
    Класс "ComPort" http://pastie.org/10814442
    private void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                byte[] inBuf = new byte[256];
                int rxCount = _comPort.Read(ref inBuf, 2); //Максимальное время между байтами одной посылки 
                if (rxCount < 5) return; //Не наше
    
    //Обрабатываем массив inBuf 
            } 
    
    private ComPort _comPort = new ComPort();
    private void LoadPortSettings() //Повесить на загрузку формы
            {
                _comPort.DataReceived += ComPort_DataReceived;
    
                cmbPort.Items.Clear();
                cmbPort.Items.AddRange(_comPort.PortNames());
                cmbBaudRate.Items.Clear();
                cmbBaudRate.Items.AddRange(_comPort.BaudRates());
    
                cmbPort.SelectedItem = Properties.Settings.Default.Port;
                cmbBaudRate.SelectedItem = Properties.Settings.Default.BaudRate;
            }
    
    private void UpdatePortSettings() //Повесить на изменение комбобоксов cmbPort и cmbBaudRate
            {
                int cpi = cmbPort.SelectedIndex;
                int bri = cmbBaudRate.SelectedIndex;
                if (cpi >= 0 && bri >= 0)
                {
                    string port = cmbPort.Items[cpi].ToString();
                    string baudRate = cmbBaudRate.Items[bri].ToString();
                    if (!string.IsNullOrWhiteSpace(port) && !string.IsNullOrWhiteSpace(baudRate) 
                        && _comPort.isPortChange(port,baudRate))
                    {
                        _comPort.Open(port, baudRate);
                    }
                }
            }
    Ответ написан
    Комментировать