Передача команд по COM пору в SMSD-4.2
 

Передача команд по COM пору в SMSD-4.2

Автор Underside, 02 февраля 2012, 12:01:23

« назад - далее »

Underside

Пишу программу на С++, для общения с портом использую библиотеку SerialGate. При попытке отослать команду на часть символов срабатывает ошибка E15*.
К примеру при отправке команды LD1* в ответ приходит LE15*1*E16*. Из всего латинского алфавита распознает символов 12.

Administrator

E15* - ошибка передачи по COM-порту. Проверьте настройки передачи данных.

Underside

Настройки стоят такие же как и в программе smc_program. Вопрос почему микроконтроллер принимает только часть букв. "L" принял а "D" не принял

Administrator

А через SMC_Program передача данных нормально идет? Если да, то ищите ошибки в программной части. Не забывайте, что после каждой команды нужно дождаться эхо и ответ и только после этого передавать следующую команду.

Если через SMC_Program тоже ошибки - проверьте разъем и кабель, убедитесь, что нет существенных помех.
Я не изучала внимательно, что представляет собой SerialGate, но проверьте, что эта библиотека предоставляет полноценную работу с портами.
К примеру, уверены ли Вы в том, с какими параметрами открываете порт? Проверяете ли Вы структуру DCB? (Вернее, что именно делает библиотека SerialGate с этой структурой). Какой буфер для приема данных (чтения из порта)?

Underside

Использовал эту библиотеку для работы с двигателями Faulhaber и Микроконтроллером XMEGA по виртуальному COM порту, все работало хорошо.
В Вашей программе все работает.

Underside

Могли бы Вы дать рекомендации какую библиотеку использовать для общения по COM- порту или указать исходники для этого. Интересует только передача по COM порту.

Administrator

Конкретную библиотеку рекомендовать не могу, т.к. предпочитаю собственный код, в который при необходимости могу внести изменения. Можно попробовать любую другую библиотеку, возможно, Вам попадется более удачная. А еще лучше найти исходный код используемой библиотеки, проверить и при необходимости внести исправления и подключить модуль при компиляции.
Вам на электронную почту отправила кусок, отвечающий за открытие и настройку порта  для передачи данных в программе SMC_Program.

Если есть сомнения, можете проверить работу блока со стандартной программой windows Hyper terminal или доступной в сети ComPort Toolkit - там относительно стандартная реализация.

К сожалению, я не знаю, как взаимодействуют двигатели Faulhaber с микроконтроллерами XMEGA. Возможно, там урезанный протокол или однонаправленная передача.

Могу порекомендовать книгу "Павел Агуров Последовательные интерфейсы ПК. Практика программирования" там приведены работающие примеры на Си и Дельфи. Или попробуйте раздобыть исходные коды с диска, который прилагается к этой книге - их можно использовать с минимальными изменениями.

Underside

это моя инициализация DCB, укажите структуру в smc_program

//инициализация структуры DCB
dcb.BaudRate =  BaudRate;                        //задаём скорость передачи 115200 бод
dcb.fBinary = TRUE;                                    //включаем двоичный режим обмена
dcb.fOutxCtsFlow = FALSE;                              //выключаем режим слежения за сигналом CTS
dcb.fOutxDsrFlow = FALSE;                              //выключаем режим слежения за сигналом DSR
dcb.fDtrControl = DTR_CONTROL_DISABLE;                 //отключаем использование линии DTR
dcb.fDsrSensitivity = FALSE;                           //отключаем восприимчивость драйвера к состоянию линии DSR
dcb.fNull = FALSE;                                     //разрешить приём нулевых байтов
dcb.fRtsControl = RTS_CONTROL_DISABLE;                 //отключаем использование линии RTS
dcb.fAbortOnError = FALSE;                             //отключаем остановку всех операций чтения/записи при ошибке
dcb.ByteSize = 8;                                      //задаём 8 бит в байте
dcb.Parity = 0;                                        //отключаем проверку чётности
dcb.StopBits = 0;                                      //задаём один стоп-бит


Administrator

Я Вам на почту вчера отправила структуру DCB для smc_program, вместе со всем остальным кодом, отвечающим за передачу данных. Пожалуйста, проверьте почту.

{ Чистка структуры }
FillChar(dcb, SizeOf(dcb), 0);
{ Пеле DCBLength должно содержать размер структуры }
dcb.DCBLength:= SizeOf(dcb);
{ Скорость обмена (бод) }
dcb.BaudRate := WindowsBaudRates[FBaudRate];
{ Windows не поддерживает не бинарный режим работы последовательных портов }
dcb.Flags    := dcb_Binary;

dcb.Flags    := dcb_AbortOnError;
dcb.Flags    := dcb_OutxCtsFlow;
dcb.Flags    := dcb_OutxDsrFlow;
dcb.Flags    := dcb_DtrControlMask;
dcb.Flags    := dcb_DtrControlHandshake;
dcb.Flags    := dcb_RtsControlMask;
dcb.Flags    := dcb_RtsControlHandshake; 

{ Число бит в байте }
dcb.ByteSize := 5 + Ord(FByteSize);
{ Контроль четности }
dcb.Parity   := Ord(FParity);
{ Число стоп бит }
dcb.StopBits := Ord(FStopbits);

{ Установить новые настройки порта }
SetCommState(FHandle, dcb);

Administrator

Проверка четности должна быть - "чет", стоп-бит - 1.

Nata

Уважаемый администратор!

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

Administrator


Nata

Цитата: Administrator от 10 июня 2013, 17:33:28
ЦитироватьNata

Отправлено.
Хочу сказать большое спасибо, очень помогли.

Вопрос по WaitFullBuffer. Если ставлю true, то не все данные возвращает. Похоже дело в InBufSize. Какой она должна иметь размер в данном случае?
Если WaitFullBuffer=false, то ставлю InBufSize=1.

Administrator

Если WaitfullBuffer=true, то функция ждет полного заполнения буфера, размер которого определяется InBufSize.

InBufSize - максимальный размер данных, которые функция может принять.

Лучше поставить WaitfullBuffer=false,  a InBufSize какой-нибудь большой (например, чтобы моно было пользоваться командой RD, которая считывает записанную в память программу). Тогда событие о получении информации из порта будет формироваться независимо от количества принятых байт, а большой размер буфера гарантирует, что Вы получили все данные из порта.

Максимка111

Уважаемый Administrator!

Будьте так добры, отправьте и мне на почту
>структуру DCB для smc_program, вместе со всем остальным кодом, отвечающим за передачу данных.

Заранее благодарен!