Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Вот нашёл у себя старенькую, кривенькую, но вполне работоспособную реализацию

Отправлено POV (78.31.77.123) 26 апреля 2011, г. 13:45
В ответ на: Может кто посоветует - как бработать буфер приема для вывода параметров+++ отправлено dshabrov 26 апреля 2011, г. 13:31


DWORD countReadByte;
BYTE zx[1024]; // кольцевой буффер
int first = 0, last = 0;
bool startRx = false;
while(1)
{
if (last > 1024) last = 0;
ReadFile(ComHandle, &zx[last], 1024-last, &countReadByte, NULL);
last += countReadByte;
if(countReadByte == 0)
{ // отчего-то ничё не приняли
ClearCommError(ComHandle,&portErr,NULL);
return HDLC_TIMEOUT;
}

bool rxStop = false;
int k;
BYTE plLRC;
for (k = last-1; k >= first; k--)
{ // в очередном куске ищём знаки окончания
if (zx[k] == '\n')
{
if (last >= 10)
{ // т.е. в буффере достаточное число байт для формата команды
if (zx[k-1] == '\r')
{
rxStop = true; // нашли признак окончания кадра
break;
}
else return MODBUS_ERR;
}
else return MODBUS_ERR;
}
}
if (!rxStop) continue; // продолжаем накапливать даные

rxStop = false;
for (k = last-4; k >= first; k--) // пропускаем конец кадра и LRC
{ // ищем начало посылки
if (zx[k] == ':')
{ // начало кадра есть
rxStop = true;
break;
}
}
if (!rxStop) return MODBUS_ERR;

rxLRC = 0;
countRx = 0;
for (k = k+1; k < last-2; k=k+2)
{
BYTE tmp1, tmp2;
if (zx[k] >= '0' && zx[k] <= '9') tmp1 = zx[k]-'0';
if (zx[k] >= 'A' && zx[k] <= 'F') tmp1 = zx[k]-'A'+10;
if (zx[k+1] >= '0' && zx[k+1] <= '9') tmp2 = zx[k+1]-'0';
if (zx[k+1] >= 'A' && zx[k+1] <= 'F') tmp2 = zx[k+1]-'A'+10;
RX[countRx] = (tmp1 << 4) | tmp2;
rxLRC += RX[countRx];
countRx++;
}
if (rxLRC != 256) return MODBUS_ERR;
if(RX[0] != Buffer[0]) return HDLC_ERR;
if(RX[1] != Buffer[1]) return HDLC_ERR;

if(countRx > (2+1))
{
OutBufferSize = countRx-2-1; // адрес, команду и LRC исключаем
for(int j=0; j < OutBufferSize; j++) Out[j] = RX[j+2];
return HDLC_DATA;
}
if(countRx == (2+1))
return MODBUS_OK;
};



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
отымите от 2 единицу:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru