Ошибка кадрирования rs232

New here, so a bit about myself first:

I am a fire alarm commissioning engineer by trade, but like to mess with electronics as a hobby.
my main area of interest is integration between various systems (which is one of the reasons I like doing fire alarms, as they interface with most systems in big buildings) and have recently started getting more involved with serial comms to interface systems, rather than boring relay contacts.

In my house, I have an 8X8 audio/video matrix switcher, this connects the stereo systems in all the rooms to each other so that i can patch any rooms audio to any of the other rooms in the house.
This switcher has an RS-232 serial port on the back, which I’m hoping I can interface to either a PI or an arduino, so that I can control it via a web interface.

After a while searching, I found the protocol for it online… but things haven’t gone so smoothly after that unfortunately.

Currently I’m just using a usb-232 converter and a null modem cable, along with a program called 232 analyser on my laptop…
I can read data fine, and send data to the unit… but it keeps spitting back a ‘framing error’ message.

I’m not sure what I’m doing wrong, please could someone advise? this is the first time I’ve really used serial so pointers would be cool.
One thing i did think is that the protocol specifies:

  • RS-232C STANDARD
  • START Bit 1
  • STOP Bit 1
  • DATA Bit 8
  • PARITY Bit EVEN
  • BAUD RATE 9600bps
  • CODE ASCII
  • TERMINATE

but my analyser program only lets me set the baud rate, data bits, parity, stop bit, and data format. not start bit. could that be my issue? and if so how do i get around it?
thanks so much in advance!

protocol page 1

protocol page 2

Всем доброго.

Ув. эксперты, поскажите, есть ли в виндовых осях возможность обнаруживать ошибки контроля чётности и другие (CE_FRAME, CE_OVERRUN) при получении данных побайтно по последовательному порту ? Пробую тестовую программу — внешним устройством (контроллером) посылается поток байт — часть с ошибкой чётности (точнее, просто с перевёрнутой чётностью), часть — без ошибок. Принимающая часть (программа под виндой) распознаёт только ошибку в самом первом испорченном байте, остальные почему-то молча пропускает — это при приёме через встроенный железный COM порт. При прохождении через виртуальный COM порт (переходник USB<->COM FT232) ещё хуже — не только пропускаются ошибочные байты, но и метятся ошибочными безошибочные данные.

Приём и проверка выполняется вот таким кодом:

static int read_byte (HANDLE handle, uint8_t * byte)
  {
  uint8_t b;
  DWORD ret;

  if (!ReadFile (handle, &b, 1, &ret, 0))
     return -1;

  if (0 == ret)
     return 0;

  DWORD err;
  ClearCommError (handle, &err, 0);

  if (err)
     {
     fprintf (stderr, "nComm Error: ");
     fprintf (stderr, CE_FRAME & err ? "F" : "-");
     fprintf (stderr, CE_RXPARITY & err ? "P" : "-");
     fprintf (stderr, CE_IOE & err ? "I" : "-");
     fprintf (stderr, CE_OVERRUN & err ? "O" : "-");
     fprintf (stderr, CE_RXOVER & err ? "B" : "-");
     fprintf (stderr, " = %02X ", b);
     return -2;
     }

  *byte = b;
  return 1;
  }

Есть код аналогичного назначения под Linux — там всё чётко работает — обнаруживаются все заваленные байты, а правильно отправленные (безошибочные) байты не маркируются как ошибочные, при работе и через реальный и через виртуальный последовательный порт. Можно было бы достичь того же результата в винде ?

интерфейс usart

Некоторые устройства, такие как GPS, GSM, RFID, датчики и т. д., должны взаимодействовать с микроконтроллером PIC для передачи или получения информации. Для связи с микроконтроллером PIC используются несколько коммуникационных протоколов, таких как RS232, SPI, I2C, CAN и т. д.

По сути, протокол представляет собой набор правил, согласованных как отправителем, так и получателем, отвечающий на вопросы:

  • Как упаковываются данные?
  • Сколько битов составляет символ?
  • Когда данные начинаются и заканчиваются?

Рассмотрим протокол передачи данных USART на примере микроконтроллера PIC18F4550 при подключении его к компьютеру через RS232. Данный материал подойдет для всей серии PIC18.

PIC18F4550 имеет встроенный модуль USART, который полезен для последовательной связи. С его помощью мы можем отправлять/принимать данные на компьютер или другие устройства.

USART также используется для взаимодействия PIC с различными модулями, такими как Wi-Fi (ESP8266), Bluetooth, GPS, GSM и т. д.

Мы увидим, как устанавливается связь между микроконтроллером PIC и ПК через USART с использованием протокола RS232.

Мы также увидим, как взаимодействовать с ноутбуками, которые не имеют порта RS232 и вместо этого используют порт USB.

Начнем с последовательной связи с использованием PIC18F4550.

Асинхронная связь

PIC18F4550 имеет встроенный асинхронный приемник-передатчик. Асинхронность означает, что каждый символ (байт данных) помещается между стартовым и стоповым битами. Стартовый бит всегда равен 0 (низкий), а стоповый бит всегда равен 1 (высокий).

Передача байта USART в PIC
Рисунок 1. Асинхронная передача байта USART

Битрейт и скорость передачи

Битрейт передачи данных при последовательной передаче данных указывается в битах в секунду (bps). Другая широко используемая терминология для бит/с — скорость передачи (baud rate). Она означает количество изменений сигнала в секунду. Здесь сигнал в битах, поэтому битрейт = скорость передачи.

Интерфейс подключения

Для подключения устройств через USART можно использовать разъем DB9. Хотя в разъеме и много контактов, нам не нужны все. Мы используем только контакты RX, TX и GND.

ПК имеет уровни RS232, тогда как микроконтроллер PIC имеет уровни TTL. RS232 имеет разные уровни напряжения для логического 0 и 1. Чтобы сделать его совместимым с уровнями напряжения PIC TTL, мы должны использовать микросхему MAX232 или ее аналоги.

Подключение MAX232 к микроконтроллеру PIC
Рисунок 2. Схема подключения микросхемы MAX232 к микроконтроллеру PIC18F4550

Расчет скорости передачи

Как рассчитать скорость передачи в PIC18F4550?

[ text{Desired Baud Rate}=frac{F_{osc}}{64times({X+1})}-1 ]

Значение, которое будет загружено в регистр SPBRG (16-разрядный) PIC18F4550 для получения желаемой скорости передачи данных.

Значение SPBRG для требуемой скорости передачи рассчитывается так:

[SPBRG=frac{F_{osc}}{64timestext{Desired Baud Rate}}-1]

Предположим, Fosc = 8 МГц и скорость передачи = 9600 бит/с.

Тогда [SPBRG = frac{8 МГц}{64 × 9600} — 1]

Следовательно, [SPBRG = 12]

Приведенная выше формула зависит от бита BRGH в регистре TXSTA.

Регистр TXSTA

Давайте подробно рассмотрим регистр TXSTA, который используется для настройки передачи.

Регистр TXSTA PIC18
Рисунок 3. Регистр TXSTA

TXEN : бит разрешения передачи

  • 0 = отключить передачу
  • 1 = включить передачу

BRGH : бит выбора высокой скорости передачи данных

  • 0 = низкая скорость
  • 1 = высокая скорость

Бит CSRC не используется для асинхронной связи.

TX9 : бит разрешения 9-ти битной передачи

  • 0 = выбрать 8-битную передачу
  • 1 = выбрать 9-битную передачу

SYNC : бит выбора режима USART

  • 0 = асинхронный режим
  • 1 = синхронный режим

SENDB : бит символа разрыва отправки

  • 0 = передача Sync Break завершена
  • 1 = отправить Sync Break при следующей передаче (сбрасывается аппаратно после завершения)

TRMT : передача бита состояния сдвигового регистра

  • 0 = TSR заполнен
  • 1 = TSR пуст

TX9D : 9-й бит передачи данных

Может быть битом адреса/данных или битом четности.

Загрузите рассчитанное значение непосредственно в регистр SPBRG.

Регистр RCSTA

В PIC18F4550 регистр RCSTA используется для настроек приема последовательных данных.

Регистр RCSTA микроконтроллера PIC
Рисунок 4. RCSTA регистр управления приемом и состояния

SPEN : включение последовательного порта

  • 0 = отключить последовательный порт для связи
  • 1 = включить последовательный порт для связи

RX9 : бит разрешения 9-ти битного приема

  • 0 = включить 8-битный прием
  • 1 = включить 9-битный прием

Как правило, мы используем 8-битный прием

SREN : бит разрешения одиночного приема

Не используется

CREN : бит разрешения непрерывного приема

  • 0 = отключить приемник
  • 1 = включить приемник для непрерывного приема байта данных

ADDEN : бит разрешения определения адреса

При RX9 = 1

  • 0 = Отключение определения адреса, все байты принимаются, а девятый бит может использоваться как бит четности
  • 1 = включить обнаружение адреса, разрешить прерывание и загрузить буфер приема, когда установлен бит RSR

При RX9 = 0

Неважно 0 или 1

FERR : бит ошибки кадра

  • 0 = нет ошибки кадрирования
  • 1 = ошибка кадрирования (можно обновить, прочитав регистр RCREG и получив следующий допустимый байт)

OERR : бит ошибки переполнения

  • 0 = нет ошибки переполнения
  • 1 = ошибку переполнения можно сбросить, очистив бит CREN.

RX9D : 9-й бит принимаемых данных

Это может быть бит адреса/данных или бит четности, который должен вычисляться пользовательской прошивкой.

Буфер данных и флаг прерывания для последовательной связи

Для передачи данных и приема данных в PIC18F4550 выделены 8-битные регистры буферы данных TXREG и RCREG соответственно.

Рисунок 5. Регистры TXREG и RCREG
  • Когда нам нужно передать данные, мы напрямую копируем эти данные в регистр TXREG. После завершения передачи 8-битных данных генерируется флаг прерывания TXIF.
  • Этот TXIF (флаг прерывания передачи) находится в регистре PIR1. Флаг TXIF устанавливается при передаче 8-битных данных. Затем буфер готов принять другие данные для передачи.
  • Также в регистре PIR1 находится RCIF (флаг прерывания приема). Когда этот флаг установлен, это указывает, что полный байт данных получен регистром RCREG. Немедленно прочитайте регистр RCREG. Теперь регистр RCREG готов к приему других данных.
  • Когда флаг RCIF не установлен, микроконтроллеру PIC приходится ждать приема полного байта данных.

Шаги для программирования PIC18F4550 USART

Инициализация

  1. Инициализируйте скорость передачи, загрузив значение в регистр SPBRG.
  2. Затем установите бит SPEN в регистре RCSTA для включения последовательного порта.
  3. Затем установите бит BRGH в регистр TXSTA для низкой или высокой скорости.
  4. Также очистите бит SYNC в регистре TXSTA для асинхронной связи.
  5. Установите бит TXEN в регистре TXSTA, чтобы разрешить передачу.
  6. Установите бит CREN в регистре RCSTA, чтобы разрешить прием.
#define F_CPU 8000000/64

void USART_Init(long baud_rate)
{
    float temp;
    TRISC6=0;        /* Сделайте вывод Tx выходным*/
    TRISC7=1;        /* Сделайте контакт Rx входным */
    /* Baud rate=9600, SPBRG = (F_CPU /(64*9600))-1*/
    temp= (( (float) (F_CPU) / (float) baud_rate ) - 1);     
    SPBRG = (int) temp;    
    TXSTA = 0x20;    /* включить передачу;*/
    RCSTA = 0x90;    /* Включение RX и последовательного порта */
}

Режим передачи

  1. Копируем данные, которые хотим передать в регистр TXREG.
  2. Следите за флагом TXIF, который устанавливается после завершения передачи.
Char USART_TransmitChar (char out)
{
   while (TXIF == 0);    /* Дождитесь флага прерывания передачи */
   TXREG = out;      /* Запись данных char для передачи регистра */    
}

Режим приема

  1. Следите за флагом RCIF, пока он не будет установлен в 1, что указывает на то, что в регистр RCREG принят полный 1 байт.
  2. Также проверьте наличие бита OERR. Если он установлен, отключите и включите бит CREN.
  3. Затем немедленно прочитайте регистр RCREG, чтобы избежать переполнения.
Char USART_ReceiveChar()
{
    while(RCIF==0);      /* дождитесь получения флага прерывания */
    if(RCSTAbits.OERR)
    {           
        CREN = 0;
        NOP();
        CREN=1;
    }
    return(RCREG);       /* получено в регистре RCREG и возвращено в основную программу */
}

Связь USART с использованием процедуры обслуживания прерываний (ISR)

Вышеупомянутая связь USART выполняется путем непрерывного опроса флага прерывания.

Однако опрос флага прерывания увеличивает энергопотребление микроконтроллера, а также он не может выполнять другие задачи, так как опрос прерывания выполняется непрерывно.

Подпрограмма обслуживания прерываний (ISR) выполняет код приложения всякий раз, когда происходит прерывание. И если прерывания не происходит, микроконтроллер может выполнять другие задачи.

Чтобы использовать USART ISR в PIC18F4550, необходимо включить GIE (разрешение глобальных прерываний), PEIE (разрешение периферийных прерываний) вместе с RCIE (разрешение прерывания приема) и TXIE (разрешение прерывания передачи).

Шаги для программирования PIC18F4550 USART с использованием прерывания

Инициализация с прерываниями

  1. Инициализируйте скорость передачи, загрузив значение в регистр SPBRG.
  2. Затем установите бит SPEN в RCSTA для включения последовательного порта.
  3. Затем установите бит BRGH в TXSTA для низкой или высокой скорости.
  4. Кроме того, очистите бит SYNC в регистре TXSTA для асинхронной связи.
  5. Установите бит TXEN в регистре TXSTA, чтобы разрешить передачу.
  6. Установите бит CREN в регистре RCSTA, чтобы разрешить прием.
  7. Включите GIE, PEIE, RCIE и TXIE для ISR.
#define F_CPU 8000000/64

void USART_Init(long baud_rate)
{   
    float temp;
    TRISC6=0;        /* Сделайте вывод Tx выходным*/
    TRISC7=1;        /* Сделайте контакт Rx входным */
    temp=(( (float) (F_CPU) / (float) baud_rate) - 1);     
    SPBRG = (int) temp;    /* Baud rate=9600 SPBRG=(F_CPU /(64*9600))-1*/
    TXSTA = 0x20;    /* включить передачу;*/
    RCSTA = 0x90;    /* Включение RX и последовательного порта */
    INTCONbits.GIE = 1;   /* Включить глобальное прерывание */
    INTCONbits.PEIE = 1;  /* Включить периферийное прерывание */
    PIE1bits.RCIE = 1;    /* Включить прерывание приема */
    PIE1bits.TXIE = 1;    /* Включить прерывание передачи */
}

Новичок, поэтому сначала немного о себе:

По профессии я инженер-наладчик пожарной сигнализации, но в качестве хобби люблю возиться с электроникой. моя основная область интересов — интеграция между различными системами (это одна из причин, по которой мне нравится заниматься пожарной сигнализацией, поскольку они взаимодействуют с большинством систем в больших зданиях), и в последнее время я стал больше заниматься последовательной связью для взаимодействия систем, а не скучно контакты реле.

В моем доме есть матричный аудио/видео коммутатор 8X8, который соединяет стереосистемы во всех комнатах друг с другом, так что я могу подключить звук любой комнаты к любой другой комнате в доме. Этот коммутатор имеет последовательный порт RS-232 на задней панели, который, я надеюсь, я смогу подключить к PI или Arduino, чтобы я мог управлять им через веб-интерфейс.

После некоторого поиска я нашел протокол для этого в Интернете… но, к сожалению, после этого все пошло не так гладко.

В настоящее время я использую только преобразователь usb-232 и нуль-модемный кабель, а также программу под названием 232 Analyzer на моем ноутбуке… Я могу нормально читать данные и отправлять данные на устройство… но оно продолжает выплевывать обратно сообщение об ошибке кадра.

Я не уверен, что я делаю неправильно, пожалуйста, может кто-нибудь посоветовать? это первый раз, когда я действительно использовал серийный номер, поэтому указатели были бы крутыми. Одна вещь, которую я действительно думал, это то, что в протоколе указано:

  • СТАНДАРТ RS-232C
  • СТАРТ Бит 1
  • СТОП Бит 1
  • ДАННЫЕ Бит 8
  • ЧЕТНОСТЬ Бит ЧЕТНОСТЬ
  • СКОРОСТЬ ПЕРЕДАЧИ 9600 бит/с
  • КОД ASCII
  • ЗАВЕРШИТЬ

Но моя программа-анализатор позволяет мне устанавливать только скорость передачи данных, биты данных, четность, стоповый бит и формат данных. не стартовый бит. может это моя проблема? и если да, то как мне обойти это? Большое спасибо заранее!

protocol page 1

protocol page 2

1 ответ

Формат, наиболее часто используемый для последовательных соединений, использует один стартовый бит, 8 битов данных, без контроля четности и один стоповый бит.


1

Kathy
15 Июл 2014 в 20:41

Новое здесь, поэтому сначала немного о себе:

По профессии я инженер по вводу в эксплуатацию пожарной сигнализации, но люблю увлекаться электроникой в ​​качестве хобби. Моя основная область интересов — это интеграция между различными системами (это одна из причин, по которой мне нравится делать пожарную сигнализацию, так как они взаимодействуют с большинством систем в больших зданиях), и в последнее время я стал больше увлекаться последовательной связью с интерфейсными системами, а не скучно. контакты реле.

В моем доме у меня есть матричный коммутатор аудио / видео 8X8, который соединяет стереосистемы во всех комнатах друг с другом, так что я могу соединить аудио из любых комнат с любыми другими комнатами в доме. Этот коммутатор имеет последовательный порт RS-232 на задней панели, который, я надеюсь, я могу связать либо с PI, либо с Arduino, чтобы я мог управлять им через веб-интерфейс.

Через некоторое время поиска я нашел протокол для него в Интернете… но, к сожалению, после этого дела пошли не так гладко.

В настоящее время я просто использую конвертер usb-232 и нуль-модемный кабель, а также программу под названием 232 analyzer на моем ноутбуке… Я могу нормально читать данные и отправлять данные на устройство… но он продолжает вылетать обратно сообщение об ошибке кадрирования.

Я не уверен, что я делаю не так, пожалуйста, кто-то может посоветовать? это первый раз, когда я действительно использовал сериал, так что указатели были бы крутыми. Одна вещь, которую я действительно думал, — то, что протокол определяет:

  • СТАНДАРТ RS-232C
  • СТАРТ Бит 1
  • СТОП Бит 1
  • ДАННЫЕ Бит 8
  • ПАРИТЕТ Бит ДАЖЕ
  • Скорость передачи 9600 бит / с
  • КОД ASCII
  • ПРЕКРАТИТЬ

но моя программа-анализатор позволяет мне устанавливать только скорость передачи, биты данных, четность, стоп-бит и формат данных. не начать немного. это может быть моей проблемой? и если да, то как мне обойти это? Большое спасибо заранее!

протокол страницы 1

страница протокола 2

Понравилась статья? Поделить с друзьями:
  • Ошибка кадастрового инженера при межевании земельного участка
  • Ошибка кадастрового инженера куда жаловаться
  • Ошибка кабинет формируется кабинет налогоплательщика
  • Ошибка к1570 нива шевроле
  • Ошибка к0300 нива шевроле