Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
30.05.2010, 00:19
|
|
Прохожий
Регистрация: 27.05.2010
Сообщений: 3
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
win32 RS-232C послать последовательность бит в байте
Итак, задача:
ОТослать по протоколу RS-232C с помощью программирования под win32 API байт с логигической последовательность бит: 01111111(единица перавая остальные, нули).
Если расматривать на физическом уровне, то сигнал по протоколу RS-232С должен быть с инверсией, то есть:
111111111111111110100000001111111111
Там где 1 - уровень напряжения +3-+12В
где 0 -уровень напряжения -3--12В.
Главная задача из этого участка выделить 10100000001 которую будет распозновать МК и что-то с ней делать.
Вопрос реально ли вообще с помощь этого протокола RS-232C создать такую последовательность физических импульсов, или байт будет передаваться пакетом со всеми заголовками, которые будут поступать на МК и мешать нам.
ЗЫ: Сорри если не туда запостил.
Последний раз редактировалось Antinup; 30.05.2010 в 00:30.
|
|
|
|
30.05.2010, 00:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.05.2010
Сообщений: 1,118
Сказал спасибо: 150
Сказали Спасибо 604 раз(а) в 310 сообщении(ях)
|
Re: win32 RS-232C послать последовательность бит в байте.
и что вам мешает послать байт 01111111 = $7F ...а протоколом пусть система занимается
Цитата:
|
настраиваем...
DCB dcb;
GetCommState(hCom_1, &dcb);
dcb.BaudRate = CBR_115200;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;
dcb.fParity = 0;
SetCommState(hCom_1, &dcb);
COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 10;
timeouts.WriteTotalTimeoutMultiplier = 0;
SetCommTimeouts(hCom_1, &timeouts);
|
далее посылаем байт... прием с ожиданием можете убрать
Цитата:
|
OVERLAPPED o;
o.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// тестовый байт для проверки устройства
const BYTE TEST_BYTE[] = {0, 0x7F};
DWORD bytesCount;
WriteFile(hCom_1, &TEST_BYTE[0], 2, &bytesCount, &o);
DWORD error = GetLastError();
if(error == ERROR_IO_PENDING){
DWORD result = WaitForSingleObject(o.hEvent, 50);
if(result == WAIT_TIMEOUT){
CloseHandle(hCom_1);
return FALSE;
}
}else{
CloseHandle(hCom_1);
return FALSE;
}
Sleep(50);
BYTE receivedByte[128] = {0};
ReadFile(hCom_1, &receivedByte[0], 128, &bytesCount, &o);
error = GetLastError();
if(error == ERROR_IO_PENDING){
DWORD result = WaitForSingleObject(o.hEvent, 200);
if(result == WAIT_TIMEOUT){
CloseHandle(hCom_1);
return FALSE;
}else{
BOOL replyFound = false;
for(int i=0; i‹128 && !replyFound; i++){
replyFound = (receivedByte[i] == 0x7F);
}
CloseHandle(hCom_1);
///return replyFound; // возвращаем
}
}else{
CloseHandle(hCom_1);
return FALSE;
}
|
|
|
|
|
30.05.2010, 00:32
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: win32 RS-232C послать последовательность бит в байте.
Вообще-то у RS232 1 это -5/-12 В, 0 +5/+12 В. Уровни -3,+3 В считаются неопределенными и могут восприниматься, как 0 или 1.
|
|
|
|
30.05.2010, 01:26
|
|
Прописка
Регистрация: 23.01.2008
Сообщений: 102
Сказал спасибо: 0
Сказали Спасибо 21 раз(а) в 19 сообщении(ях)
|
Re: win32 RS-232C послать последовательность бит в байте.
На бейсике отправить байт в порт намного проще!
Вот пример отправки байта $7F через COM1, со скоростью 9600 бод.
Код:
|
If OpenSerialPort(1, "COM1", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 256, 256)
OutByte.a=$7F
WriteSerialPortData(1, @OutByte, 1)
CloseSerialPort(1)
EndIf |
|
|
|
|
30.05.2010, 01:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.05.2010
Сообщений: 1,118
Сказал спасибо: 150
Сказали Спасибо 604 раз(а) в 310 сообщении(ях)
|
Re: win32 RS-232C послать последовательность бит в байте.
ну, вообще-то вы опускаете настройку СOM порта, которая заведена у вас в функцию и скрыта услужливо от глаз средой... а вот вам и на delphi:
Цитата:
|
Com:= CreateFile('COM1',
GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Result:= (Com › 0) and SetCommTiming and
SetCommBuffer(InQueue,OutQueue) and
SetCommStatus(9600);
WriteFile(Com, $7F, 1,TX_Count,nil);
CloseHandle(Com)
|
как видите тоже намного проще ...а winapi он и в африке winapi/
|
|
|
|
30.05.2010, 01:41
|
|
Прохожий
Регистрация: 27.05.2010
Сообщений: 3
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: win32 RS-232C послать последовательность бит в байте.
Спасибо кто ответил.
raxp, то есть на выходе ком порта получем нам нужный сигнал: 111111111111111110100000001111111111
или же байт будет отправляться пакетом, со всякими заголовками, которые будут мешать?
realid, наверно +5-+15 и -5--15, судя из этой статьи http://www.gaw.ru/html.cgi/txt/interface/rs232/
еще вопросик, МК как правило работает с +5В, как лучше пребразовать сигнал по уровню, чтобы МК правильно воспринимал 1 - (+5-+15) и 0 - (-5--15) и нормально работал
|
|
|
|
30.05.2010, 01:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.05.2010
Сообщений: 1,118
Сказал спасибо: 150
Сказали Спасибо 604 раз(а) в 310 сообщении(ях)
|
Re: win32 RS-232C послать последовательность бит в байте.
...на выходе COM порта получим пакет согласно стандарту интерфейса, но вы забываете, что этот же сигнал с пакетом будет преобразован при приеме встроенным COM портом на МК ...и по прерыванию его можно будет прочесть из буфера в соответствующем регистре согласно спецификации на МК, так сказать - в исходном виде ...в идеальных условиях конечно, если будут помехи и длинная линия связи, то вам следует озаботиться о протоколе обмена с контролем ошибок, MODBUS например или что проще - M-Link (но это так, на будущее, цели вашего девайса пока неизвестны)
...чтобы правильно воспринимал, обычно ставится преобразователь по типу MAX232, ADM3202 и т.п., лучше еще если и с гальванической развязкой, можно добавить оптронов, но есть и со встроенными (COM порты на компьютерах они знаете-ли нежные девайсы)
Последний раз редактировалось raxp; 30.05.2010 в 01:52.
|
|
|
|
30.05.2010, 08:17
|
|
Частый гость
Регистрация: 28.04.2007
Сообщений: 40
Сказал спасибо: 2
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: win32 RS-232C послать последовательность бит в байте.
Сообщение от raxp
|
как видите тоже намного проще ...а winapi он и в африке winapi/
|
Думаю пример несколько не корректный если CreateFile "скрыта услужливо от глаз средой" то SetCommTiming, SetCommBuffer, SetCommStatus кто то должен расписать ручками
|
|
|
|
30.05.2010, 08:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.05.2010
Сообщений: 1,118
Сказал спасибо: 150
Сказали Спасибо 604 раз(а) в 310 сообщении(ях)
|
Re: win32 RS-232C послать последовательность бит в байте.
...а вы товарищ взгляните на второй пост для начала а насчет корректности
Цитата:
|
function CreateFile; external kernel32 name 'CreateFileA';
|
думаю вопросы не должны возникнуть вперед в MSDN
|
|
|
|
30.05.2010, 08:58
|
|
Частый гость
Регистрация: 28.04.2007
Сообщений: 40
Сказал спасибо: 2
Сказали Спасибо 7 раз(а) в 5 сообщении(ях)
|
Re: win32 RS-232C послать последовательность бит в байте.
Сообщение от raxp
|
думаю вопросы не должны возникнуть
|
По второму посту нет вопросов, с тем, что CreateFile "скрыта услужливо от глаз средой" вроде бы то же не возражал, а вот SetCommTiming, SetCommBuffer, SetCommStatus в MSDN не нашел
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:58.
|
|