Dmitry Samoylov
Гость
|
|
« : 15-04-2006 08:48 » |
|
в общем проблемка тут есть одна, написал прогу для отправки данных по Com порту.. Но вот проблема, когда посылаю данные допустим 0xF ---- то и получаю 0xF всё хорошо, Но если посылаю 0xF1 ------- 1111 0001 то на Rx получаю 111 0001, утерян первый бит и чем больше посылаю 0xFF1 ---- 1111 1111 0001 на Rx 1111 0111 0001 в общем лажа... На экран вывожу в десятичном виде, двоичный вид привёл для наглядности Незнаю где, может порт "недоностроил"? в общем я сломался, помогите... Я уже не на первом форуме спрашиваю. Но везде молчат? DCB dcb; COMMTIMEOUTS ct; HANDLE port; DWORD bc; DWORD mask;
dcb.DCBlength=sizeof(DCB); dcb.fBinary=1; BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcb); dcb.fNull=true; ct.ReadIntervalTimeout=10; ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0; ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;
port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
SetCommState(port,&dcb); SetCommTimeouts(port,&ct); PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR); SetupComm(port,256,256);
int buf_out=0xF1; int buf_in;
WriteFile(port,&buf_out,11,&bc,NULL); printf("out: %d\n",buf_out); ////// вижу 241 //// в десятичном
SetCommMask(port,EV_RXCHAR); WaitCommEvent(port,&mask,NULL); ReadFile(port,&buf_in,100,&bc,NULL); printf("in: %d\n",buf_in); ////// вижу 113 //// в десятичном CloseHandle(port);
Все ответившим благодарен, а реально помогшим тем более.... Не страшно если не знаешь, страшно если не учишся.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 15-04-2006 09:30 » |
|
WriteFile(port, &buf_out ,11,&bc,NULL);
точно & надо?
аналогиччно в
ReadFile(port,&buf_in,100,&bc,NULL);
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #2 : 15-04-2006 11:39 » |
|
Алексей1153, конечно.
Dmitry Samoylov, а почему у тебя бувером выступает int, а размер ты задаешь произвольный: 11 и 100 байт?! Так нельзя. используй char или подобный тип.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Serg79
|
|
« Ответ #3 : 15-04-2006 11:43 » |
|
У Тебя вообще какая та чухня написанна!!!!!!!!!! Что это такое:
int buf_out=0xF1; int buf_in;
WriteFile(port,&buf_out,11,&bc,NULL); ReadFile(port,&buf_in,100,&bc,NULL); // ужас, ты такими темпами всю прогу в памяти затрешь
Тебе надо передовать указатель на массив символов а не на целочисленную переменную. Пиши так:
char buf_out[11]; char buf_in[100];
WriteFile(port,buf_out,11,&bc,NULL); ReadFile(port,buf_in,100,&bc,NULL);
А с указателями надо уметь работать, а не то проблем необерешься.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 15-04-2006 14:42 » |
|
Serg79, поспокойнее Человек просто не в курсе
|
|
|
Записан
|
|
|
|
Dmitry Samoylov
Гость
|
|
« Ответ #5 : 18-04-2006 08:45 » |
|
Ок.. Может я не прав... Но вот вам вопрос? Пример: int x=0010; это же реально число 2 char x[4]="0010"; а это набор символов ? тобишь отдельно ноль, ноль, и т.д Я неуверен в том, что на осциллографе я увижу char x="А"-1010 скорей всего это будет ASCII код "A" - 41. Это одно и тоже или нет? В том смысле что переферийному уст-ву всё равно как отсылается?? И ещё, а тогда как в шеснадцатиричном виде? char x[5]="0xFF" - послал и тоже самое пришло, но это же не правельно? Если в чем то не прав, извините грамотно вопросы задавать тоже надо уметь... Спасибо за ответы... PS. И кстати надо помогать а не шуметь по поводу неправельности кода, потому что даже умный сомневается, а глупый уже уверен..
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #6 : 18-04-2006 09:58 » |
|
int x=0010; это же реально число 2 это реально число 8. и твоя ошибка не в числах а в ссылках на это число, вместо ссылок на массивы данных.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Dmitry Samoylov
Гость
|
|
« Ответ #7 : 18-04-2006 10:24 » |
|
Ну не знаю 0010 в десятичном виде это 2 (собственно, о чём разговор); Так вот ------>на экран> X=241 в десятичном виде.(осциллограф покажет 11110001) true ------> на экран> x=0xF1 и заданы они ASCII.(осциллограф покажет 1011 1111 1000 1111 0111 -> в десятичном 0784631, что соответствует значениям ASCII кодам символов. :confused:Может я Вообще не понимаю Если не прав поправте.. И предложите свои решения. Заранее всем спасибо. Не страшно если не знаешь, страшно если не учишься.
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #8 : 18-04-2006 10:45 » |
|
Ну не знаю 0010 в десятичном виде это 2 (собственно, о чём разговор); Видимо, не знаете (а может я ошибаюсь), но насколько, мне известно, числа начинающиеся с 0 обрабатываются компилятором, как числа в восмеричной системе. То бишь int x=10 (фактически 10) int x=010 (фактически 8 ) ==== тут немного о другом говорили... у Вас int buf_in // это число (4 байта) ReadFile(port, &buf_in,100 // а тут получаете ссылку на число, и по этому адресу пишете 100 байт... вопрос: куда будут писаться последние 96 байт Вам нужно передавать ссылку не на число, а на массив.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Dmitry Samoylov
Гость
|
|
« Ответ #9 : 18-04-2006 11:40 » |
|
Теперь понял!! Спасибо, а то так бы и не заметил.. А по поводу другово, что я описал идей нет?
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #10 : 18-04-2006 11:59 » |
|
Попробуй сделать unsigned char buf_in, buf_out и писать и читать по одному байту.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
asker
|
|
« Ответ #11 : 18-04-2006 14:08 » |
|
Привет Dmitry Samoylov Если актуален вопрос насчет потери старшего бита,то (если конечно мне память не изменяет) проблема в таймаутах, попробуй поэксперементировать со значением поля WriteTotalTimeoutMultiplier
|
|
|
Записан
|
С уважением, asker
|
|
|
Serg79
|
|
« Ответ #12 : 19-04-2006 04:05 » |
|
Привет Dmitry Samoylov Если актуален вопрос насчет потери старшего бита,то (если конечно мне память не изменяет) проблема в таймаутах, попробуй поэксперементировать со значением поля WriteTotalTimeoutMultiplier
Таймауты сдесь не причем, проблемма в том, что человек не может понять в чем разница между: int a = 0xFFFFFFFF; и char a[] = "0xFFFFFFFF";
и он думает, что в памяти они должны занимать одинаковый размер.
|
|
|
Записан
|
|
|
|
Dmitry Samoylov
Гость
|
|
« Ответ #13 : 19-04-2006 07:29 » |
|
Я ещё раз говорю, неужеле не понятно, то что вы видите в линии и то что передаёте, не одно, и тоже. когда char, передаётся ASCII код, когда int его двоичный код... Причём здесь память ? сейчас это не имеет значения для меня? Мне важно чтоб, то что я передал, я увидел и в линии, и на приёмном конце.. Переферийное устройство не воспринимает ASCII код, это понятно? ребят столько разговоров и не одного совета. Когда идёт передача мне нужно в линии получить 0xF1-1111 0001, а не 1011 1111 1000 1111 0111 -> в десятичном 0784631. Всё что нужно это просто самим понять вопрос?
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #14 : 19-04-2006 07:50 » |
|
ты пробовал передавать один байт?
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Serg79
|
|
« Ответ #15 : 19-04-2006 08:00 » |
|
Диман, ты не кипятись. Если тебе надо послать одно шестнадцатиричное значение 0xF1 то делай так: char a = 0xF1; WriteFile(ghPort,&a,sizeof(char),&dwWrite,NULL);
а принимай так: char b; ReadFile(ghPort,&b,sizeof(char),&dwWrite,NULL);
и я тебе даю 100%, что символы a и b будут одинаковы.
|
|
|
Записан
|
|
|
|
Dmitry Samoylov
Гость
|
|
« Ответ #16 : 19-04-2006 09:52 » |
|
Дайт ошибку... (см строчку 1) warning C4305: 'initializing' : truncation from 'const int' to 'char' warning C4309: 'initializing' : truncation of constant valueЗаконно... чЕ дЕлАтЬ... 1 char buf_out= 0xF1; 2 char buf_in; 3 WriteFile(port,&buf_out,sizeof(char),&bc,NULL); 4 printf("%d\n",bc); 5 printf("out: %d\n",buf_out); 6 7 8 SetCommMask(port,EV_RXCHAR); 9 WaitCommEvent(port,&mask,NULL); 10 11 ReadFile(port,&buf_in,sizeof(char),&bc,NULL); 12 13 14 printf("in: %d\n",buf_in); 15 16 17 CloseHandle(port);
|
|
« Последнее редактирование: 19-12-2007 21:27 от Алексей1153++ »
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #17 : 19-04-2006 11:05 » |
|
Не обрашай внимания, компилятор воспринемает константу 0xF1 как int (т.е. он ее понимает как 0x000000F1). Поэтому он и выдает это предуприждение об усичение размера int к char. Если тебя раздражает это сообщение, то перепеши так: char buf_out; buf_out = 0xF1;
и будет все ОК.
|
|
|
Записан
|
|
|
|
Dmitry Samoylov
Гость
|
|
« Ответ #18 : 19-04-2006 12:02 » |
|
Один бит он отправляет. Все верно.. А если нужно отослать 0x0A1 или 0xF21 то тут возникает ошибка как тут то быть? Даёт ошибки (см. строку 2)warning C4305: '=' : truncation from 'const int' to 'char' (см. строку 2)warning C4309: '=' : truncation of constant value 1 char buf_out; 2 buf_out = 0xF1; 3 char buf_in;
|
|
« Последнее редактирование: 19-12-2007 21:29 от Алексей1153++ »
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #19 : 19-04-2006 12:04 » |
|
Завтра, объясним Тебе что к чему, а сейчас рабочий день уже кончился.
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #20 : 19-04-2006 12:07 » |
|
Один бит он отправляет. Все верно.. не бит, а байт и число 0xА21 хранится в двух байтах, и, соответственно, buf_out должен состоять из двух байт и передаваться должно два байта. а вот с числом 0x0A1 проблем не должно быть (это 1 байт)
|
|
« Последнее редактирование: 19-04-2006 12:10 от PooH »
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
doublebug
Гость
|
|
« Ответ #21 : 19-04-2006 12:57 » |
|
А если нужно отослать 0x0A1 или 0xF21 то тут возникает ошибка как тут то быть? Даёт ошибки (см. строку 2)warning C4305: '=' : truncation from 'const int' to 'char' (см. строку 2)warning C4309: '=' : truncation of constant value 2х байтовое число short int ToSend = 0xF1F2; 4x байтовое int ToSend = 0xF1F2F3F4; Много байтовое unsigned char ToSend[_NUMBER_OF_BYTES] = {0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8 ....}; В любом случае тип приема и посылки должны совпадать а WriteFile и ReadFile им пофигу что посылать и читать им важен адрес откуда/куда и сколько байт. Те ты указываешь адрес и сколько байт читать/писать и эти функции все делают последовательно. По поводу типов unsigned char ToSend[4] = {0xF1, 0xF2, 0xF3, 0xF4}; представляет в памяти число 0xF4F3F2F1; т.е. unsigned char ToSend[4] = {0xF1, 0xF2, 0xF3, 0xF4}; int* lpNumber = (int*)ToSend; (*lpNumber == 0xF4F3F2F1) == TRUE в данном случае. проще всего не заморачиваться и посылать принимать буфер содержащий Н-е кол-во байт.
|
|
« Последнее редактирование: 19-12-2007 21:33 от Алексей1153++ »
|
Записан
|
|
|
|
Dmitry Samoylov
Гость
|
|
« Ответ #22 : 22-04-2006 10:43 » |
|
Я пока так и не сделал, чтоб два и более байт передовались... Ребята, жду вашего кода на несколько байт. Один байт передаёт легко, а вот два не как.. теряется первый бит?? Задача: Такая 1. На приёмном конце 0xF1 или 241 в линии 0 1111 0001 1 на приёмном конце 241 2. На приёмном конце 0xFА1 или 4001 в линии 0 11111010 1_0 00011 на приёмном конце 4001 Вот помогите?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #23 : 22-04-2006 11:36 » |
|
Dmitry Samoylov, пришли мне код, я проверю у себя . Если ты пишешь в VC++6
ящик
alex1153 на яндексе
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #24 : 23-04-2006 17:30 » |
|
в код ещё не вникал, просто попытался откомпилить. Первое, что бросилось в глаза (при чём даже не мне, а компилятору) вот что: unsigned char buf_out =0xF1F2; char buf_in; WriteFile(port, buf_out,sizeof( char),&bc,NULL); ReadFile(port, buf_in,sizeof( char),&bc,NULL); так даже не откомпилится, потому что char неявно преобразовать к (void*) низя. (мне кажется, тебе уже выше не раз говорили об этом) объяви массив, а НЕ ОДНУ переменную: unsigned char buf_out [100]={0xF2,0xF1,"my text"}; char buf_in[100]; а тут: WriteFile(port, buf_out,sizeof( char),&bc,NULL); ReadFile(port, buf_in,sizeof( char),&bc,NULL); становится понятно, почему больше 1 байта не передаётся, дык поставь: WriteFile(port,buf_out,sizeof( buf_out),&bc,NULL); ReadFile(port,buf_in,sizeof( buf_in),&bc,NULL); с портом не проверял, у меня один ком, но в снифере видно всё пробуй... а, не пугайся, что передастся 100 байт
|
|
« Последнее редактирование: 23-04-2006 17:50 от Алексей1153 »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 23-04-2006 17:49 » |
|
а настройки таймаутов в структуре COMMTIMEOUTS я бы поставил так: ReadIntervalTimeout=1; /* Maximum time between read chars. */ ReadTotalTimeoutMultiplier=1; /* Multiplier of characters. */ ReadTotalTimeoutConstant=10; /* Constant in milliseconds. */ WriteTotalTimeoutMultiplier=1; /* Multiplier of characters. */ WriteTotalTimeoutConstant=10; /* Constant in milliseconds. */
хотя для твоего железа возможно надо будет подбирать ReadIntervalTimeout ReadTotalTimeoutConstant WriteTotalTimeoutConstant ---------------- структура DCB. У тебя написано: dcb.fNull=true;//во первых тип неправильный - TRUE надо бы а не true
в мсдн: If this member is TRUE, null bytes are discarded when received.
то есть поставь всё таки dcb.fNull=0;
|
|
|
Записан
|
|
|
|
Serg79
|
|
« Ответ #26 : 24-04-2006 04:15 » |
|
Парни, Я думаю, что надо отправлять отсюда Дмитрия Самойлова в тему "Для начинающих" или "C/C++", т.к. он незнает даже основ работы с основными типами данных и массивами, неговоря уже о указателях. Мы сдесь только и делаем, что пытаемся ему объяснить в чем разница между "char" и "int".
|
|
|
Записан
|
|
|
|
Dmitry Samoylov
Гость
|
|
« Ответ #27 : 24-04-2006 07:10 » |
|
int 2 байта 16 бит занимает в памяти (от -32000 до 32000) int 4 байта 32 бита занимает в памяти (Значения от-2 100 000 000 до 2 100 000 000) short 2 байта
char 1 байт 8 бит-256 значений символов
Serg79 все время пытаешься уличить внезнании, собеседника это не правельно. Мне кажется ответ выше... Спасибо
|
|
|
Записан
|
|
|
|
Mаster
Гость
|
|
« Ответ #28 : 05-06-2008 09:40 » |
|
Привет! Решил отписать решение проблемы, т.к. гуглением данная ветка вылезла первой и, к сожалению, в ней не оказалось решения. В общем, IMHO зря Вы парня зачмырили. Проблема так и повисла, и дело совершенно не в размерах переменных, а в том, что терялся первый бит посылки. Я столкнулся с той же проблемой и решил следующим образом. Заметил, что после перезагрузки системы ситуация проявляется - 1бит из байта при передаче сбрасывается в 0. Но после запуска терминалки (в моём случае Terra Term Pro) на проверяемом COM-порте ситуация выправляется: первый бит передаётся корректно. В отладчике остановился после получения структуры DCB по GetCommState и сравнил поля до и после запуска терминалки. Оказалось, поля XonLim и XoffLim отличаются: 0007 и 0008, 1100 и 0000 соответственно. После правки поля XonLim первый бит стал передаваться корректно, в том числе, и после перезапуска системы. Удачи!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #29 : 05-06-2008 12:30 » |
|
Mаster, не надо гадать на кофейной гуще - действуй по документации. XON и XOFF используются только в программном режиме управления потоком. Эмпирические методы дадут себя знать позже в виде перемежающихся ошибок и тогда, когда меньше всего ждешь их.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Mаster
Гость
|
|
« Ответ #30 : 06-06-2008 11:54 » |
|
RXL, отдельное спасибо за сентенцию. Что такое XON-XOFF, я знаю. Я описал лишь решение своей проблемы. Вам же, RXL, желаю, чтобы документация, которую используете Вы, всегда соответствовала дествительности. Аминь!
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #31 : 06-06-2008 12:49 » |
|
Mаster, прочти внимательно свой пост 28 в этой ветке и расскажи нам что ты сделал. а мы тебя заслушаем
После ПЕРЕЗАГРУЗКИ - а что вообще в буфере или на порту находится ты об этом подумал? после запуска терминалки (в моём случае Terra Term Pro) на проверяемом COM-порте ситуация выправляется - понятное дело - правильно проинициализирован порт
Читай документацию.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #32 : 06-06-2008 13:30 » |
|
Вам же, RXL, желаю, чтобы документация, которую используете Вы, всегда соответствовала дествительности. Аминь! А шо? В MSDN не соответствует? А нельзя ли поподробней, а то я практически больше ничем не пользуюсь.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Mаster
Гость
|
|
« Ответ #33 : 06-06-2008 13:34 » |
|
Sla, RXL и все, кто кинул или собирается кинуть камень в мой огород - Ребята! Я зарегистрировался на Вашем форуме по одной лишь причине: для размещения решения проблемы, с которой столкнулся я и тот, чей пост стоял первым в результатах запроса в google.ru "WinAPI потеря старшего бита". Если у Вас никогда не бывало так, что Вы делаете всё по документации (и не обязательно это - MSDN), и - не работает, то это не значит, что чтение документации на что бы то ни было всегда спасает, решает проблему. Судя по постам Sla и RXL, Ваш форум существует для того, чтобы на проблемные вопросы всегда получать ответ "Читай документацию". Подумайте, если есть документация, зачем форумы?.. Знаю, что есть правила форума и их следует придерживаться. Так же в курсе, что мой пост не содержит сколько-нибудь стоящей информации по открытой теме - сразу передаю привет модератору и готов к возмездию от него ибо причина, по которой я зарегистрировался в Вашем форуме... а, ну об этом я впрочем уже писал. Дальнейшую полемику продолжать не намерен. Всем удачи и всего доброго!
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #34 : 06-06-2008 13:53 » |
|
Mаster, ух ты какой обидчивый. Мы совсем далеки от политики посылать СРАЗУ к книжкам. Но если это действительно так и есть. Для кого делать исключения? Тем более что проблемы у Dmitry Samoylov действительно были в непонимании передачи буфера - массива байт. Насколько я знаю и RXL, и Sla, и я достаточно много работали с RS-232. Почему ты не пришёл со своей проблемой к нам раньше? Ведь метод научного тыка хорош до поры до времени. Если ты "что-то" сделал и у тебя это "как-то" получилось, то стоит ли на этом успокаиваться и называть это "я решил проблему"? Если ты сторонник такой политики, то тогда действительно - удачи тебе и всего доброго.
|
|
« Последнее редактирование: 06-06-2008 13:54 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
RXL
|
|
« Ответ #35 : 06-06-2008 15:24 » |
|
Mаster, просто напросто надо полностью инициализировать порт, вне зависимости от его исходного состояния. А на счет "все по документации": много раз было. Обычный итог - неправильно понял, неверно следовал инструкциям и т.п. С неполной документацией сталкивался не раз, но COM-порт - не тот случай. Посмотри, для примера, статью Алексея: https://club.shelek.ru/viewart.php?id=208
|
|
« Последнее редактирование: 06-06-2008 15:27 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
lag
Участник
Offline
|
|
« Ответ #36 : 07-06-2008 02:21 » |
|
Мой код инициализации ком-порта, просто вставляю постоянно из одной проги в другую, работает
OpenComm() { g_hComm = CreateFile("COM1:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (g_hComm == INVALID_HANDLE_VALUE) { AfxMessageBox(_T("Don't open COM-port")); g_hComm = 0; return FALSE; } DCB *dcb;
dcb = (DCB *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DCB)); dcb->DCBlength = sizeof(DCB); GetCommState(g_hComm, dcb);
dcb->BaudRate = 115200; dcb->ByteSize = 8; dcb->fParity = NOPARITY; dcb->StopBits = ONESTOPBIT; dcb->fRtsControl = RTS_CONTROL_DISABLE;
if (!SetCommState(g_hComm, dcb)) { AfxMessageBox(_T("Ошибка инициализации СОМ-порта")); CloseHandle(g_hComm); g_hComm = 0; return FALSE; }
COMMTIMEOUTS cto; cto.ReadIntervalTimeout = 1; cto.ReadTotalTimeoutConstant = g_dwCommTimeout; cto.ReadTotalTimeoutMultiplier = 0; cto.WriteTotalTimeoutConstant = 30; cto.WriteTotalTimeoutMultiplier = 0; SetCommTimeouts(g_hComm, &cto); PurgeComm(g_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); SetupComm(g_hComm, 256, 256); HeapFree(GetProcessHeap(), 0, dcb);
return TRUE; }
// g_dwCommTimeout = 20, в моем случае т.к. ответ приходит не позже чем через 10мс после отправки запроса. // далее в цикле с небольшими сокращениями кода:
SendRequest(g_hComm, w_addr, w_type); // запрос - 0 - адрес, 1 - тип ReadFile(g_hComm, rcv, 256, &done, NULL);
void SendRequest(HANDLE hComm, WORD id_device, WORD device) { WORD crc; DWORD done; BYTE seq[8] = {0x05, 0x04}; WORD *pseqw = (WORD *) seq; if (device == 0) ................................
pseqw[1] = 0x0105; pseqw[2] = id_device; crc = GetCRC(seq, 6); seq[6] = HIBYTE(crc); seq[7] = LOBYTE(crc); // Отправить пакет в сеть WriteFile(hComm, &seq, 8, &done, NULL); }
|
|
|
Записан
|
|
|
|
lag
Участник
Offline
|
|
« Ответ #37 : 07-06-2008 02:32 » |
|
А решение проблемы при помощи подбора XON и XOFF или еще каким-то хитрым способом, также как RXL считаю неправильным. Это мне напоминает ситуацию, когда я ездил на копейке мохнатого года с разбитыми шаровыми. В один прекрасный или нет момент в повороте во двор шаровая вылетела, но до дома я доехал, просто снимал колесо, вставлял шарик на место, обколачивал место посадки шарика молотком - на пару километров хватало
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #38 : 07-06-2008 06:12 » |
|
Мой код инициализации ком-порта, просто вставляю постоянно из одной проги в другую, работает Хмм... А если протокол обмена с внешним устройством (StopBits, Parity, BaudRate и т. п.) требует другой инициализации порта?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #39 : 08-06-2008 06:53 » |
|
zubr, 99% железок работает по 8N1 и с аппаратным контролем потока или без контроля, а скорость поменять не проблема. По этой причине считаю, что copy-paste тут себя вполне опрадывавает, хотя - не дурно бы иметь возможность менять параметры.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
zubr
Гость
|
|
« Ответ #40 : 08-06-2008 07:04 » |
|
RXL, ну ладно StopBits и Parity, а таймауты? Для разных устройств их по разному надо выставлять, причем иногда в зависимости от BaudRate.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #41 : 08-06-2008 08:00 » |
|
zubr, этого я не заметил... (
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|