|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 18, 2004 08:49:04 возникла такая трабла... как работать программно с различными устройствами через COM порт, в частности с ИК ресивером. Уже кучу всего перепробывал, но не могу считать данные с COM порта. Может подскажите что. Охота понять принцип работы COM порта и работы с ним. Заранее очень благодарен... ЗЫ существует много прог типа "girder", но мне охота разобраться во всем самому. |
|
|
Дата: Июн 18, 2004 16:29:26 Не вы один хотите понять.... Я например, уже пару месяцев не могу "ОК" отловить в ответе модема... :о(( |
|
|
Дата: Июн 19, 2004 00:18:51 · Поправил: zed_0xff#include <windows.h>
// размер буфера для определения скорости
#define TESTBUF_SIZE 34100
// наполнение буфера
#define TESTBUF_FILL "This is a speed test"
// прием данных из порта
void Receive(HANDLE hComm){
DWORD dwRead;
char chRead;
do {
chRead=0;
if (ReadFile(hComm, &chRead, 1, &dwRead, NULL)){
if(dwRead){
if(chRead!=10){
printf("%c",chRead);
if(chRead==13)
printf("%c",10);
}
}
}else{
printf("An error occurred in the ReadFile call (%x)!\n",GetLastError());
exit(1);
}
} while (dwRead);
}
// передача данных в порт
void Send(HANDLE hComm){
char c;
DWORD dwWritten;
char*buf;
union{
FILETIME ft;
ULONGLONG ull;
ULONG ul;
} ft1,ft2;
while(_kbhit()){
c=_getch();
if(c==27){
printf("\n\nEnded.\n");
exit(0);
}
if(c==0){
c=_getch();
if(c==0x3b){ // F1 pressed
printf("\n\n--- speedtest started ---\n",TESTBUF_SIZE);
buf=(char*)calloc(1,TESTBUF_SIZE);
while(strlen(buf)+strlen(TESTBUF_FILL)<TESTBUF_SIZE)
strcat(buf,TESTBUF_FILL);
GetSystemTimeAsFileTime(&ft1.ft);
WriteFile(hComm, buf, TESTBUF_SIZE, &dwWritten, 0);
GetSystemTimeAsFileTime(&ft2.ft);
ft2.ull-=ft1.ull;
ft2.ull/=10000;
free(buf);
printf("--- ended. result: %lu bps ---\n",dwWritten*8/(ft2.ul/1000));
return;
}
}
printf("%c",c);
WriteFile(hComm, &c, 1, &dwWritten, 0);
if(c==13){
c=10;
printf("%c",c);
WriteFile(hComm, &c, 1, &dwWritten, 0);
}
}
}
int main(int argc,char*argv[]){
HANDLE hComm;
char portName[10];
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if(argc!=2){
printf("Please specify com port number in cmdline!\n");
return 1;
}
sprintf(portName,"COM%s",argv[1]);
printf("opening %s...\n",portName);
// открываем порт
hComm = CreateFile(portName,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if (hComm == INVALID_HANDLE_VALUE){
printf("Error opening port!\n");
return 1;
}
printf("Opened. Ready! (press F1 for speed-test)\n\n");
while(1){
SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN|FOREGROUND_INTENSITY);
// читаем
Receive(hComm);
SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
// пишем
Send(hComm);
// спим =)
Sleep(1);
}
return 0;
} |
|
|
Дата: Июн 19, 2004 00:20:04 Еще есть досовое, на асме.. надо? |
|
|
Дата: Июн 19, 2004 14:05:27 zed_0xffспасибо за код, но что-то к моей теме походу особо не относится... Еще есть досовое, на асме.. надо? Досовое не надо :( |
|
|
Дата: Июн 20, 2004 22:44:13 ALeX KpT У тебя есть прога, которая как-то работает с этим самым портом? Если есть, дык возьми port monitor с sysinternals.com и помониторь чего она и куда шлет.. фот и делов то... или я опять не догнал? :)) |
|
|
Дата: Июн 21, 2004 12:12:52 zed_0xff На асме бы все енто увидать.... Спасибо заранее! |
|
|
Дата: Июн 21, 2004 17:54:33 zed_0xff программа Girder с плугином IgorPlug. коврытья плугин гиморно, т.к. написан на дельфи, куча всяких там извращений. но охота самому понять. |
|
|
Дата: Июн 22, 2004 02:15:39 Stenton На асме бы все енто увидать.... На асме есть, но только под дос =))) Вышеприведенный код имхо на асме переписать - за час максимум... ну плюс отладка еще... так то все же прозрачно. Ничего сложного. ALeX KpT коврытья плугин гиморно, т.к. написан на дельфи, куча всяких там извращений. но охота самому понять. Дык а чем монитор порта не нравится? Ты пробовал вообще его? Может все ясно станет сразу =) |
|
|
Дата: Июн 22, 2004 15:16:31 zed_0xff согласен, просто я думал зачем переписывать, если уже есть... А так, будем ковыряться :о) Все равно, спасибо! |
|
|
Дата: Июл 8, 2004 16:08:45 · Поправил: techwriter Если хочешь разобраться до конца, найди описание микросхемы 8251 (наш аналог помоему 580ВВ51?, забыл уже). Когда-то последовательный порт (COM порт)физически существовал на МБ в виде этой микросхемы. Потом ее "загнали" в контроллер. Но функции, принцип и логика работы, адреса портов и т.д. остались прежние ну или почти совсем. |
|
|
Дата: Июл 8, 2004 16:13:40 Извиняюсь ошибочка вышла - 8251. |
|
|
Дата: Июл 8, 2004 19:01:41 · Поправил: Quantum В поиске описания желательно указать ключевое слово "UART" (или "УАПП"). |
|
|
Дата: Июл 9, 2004 09:21:05 Вот известная статья немного мной переделаная - описание регистров последователного порта 713539014__SerialPort.zip |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.129 |