|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Передать двоичный код в COM
Добрый день. Помогите, пожалуйста, по следующему вопросу.
У меня данные типа string отправляются на com порт с помощью следующей процелуры: Код:
Procedure WriteStrToPort(Str:String); Var ByteWritten:cardinal; MyBuff:Array[0..1023] Of Char; Begin FillChar(MyBuff,SizeOf(MyBuff),#0); Str:=Str+#13#10; StrPCopy(MyBuff,Str); If Not WriteFile(hPort,MyBuff,Length(Str),ByteWritten,Nil) Then Begin SysErrorMessage(GetLastError); fmMain.btnStop.Click; Exit; End; End; Все работает, но мне необходимо отправить команду в двоичном виде, со следующими условиями Цитата:
Подскажите, как необходимо изменить код? |
#2
|
|||
|
|||
Код:
function Write(const Buffer: array of Byte; NumberOfBytesToWrite: Cardinal): Cardinal; begin Result := 0; if FPortHandle <> INVALID_HANDLE_VALUE then begin WriteFile(hPort, Buffer, NumberOfBytesToWrite, Cardinal(Result), @OverlappedWrite); end; end; Где OverlappedWrite - TOverlapped. Соответствтенно забиваешь свои в массив байт и высылаешь в порт. |
Этот пользователь сказал Спасибо CynicRus за это полезное сообщение: | ||
sforce (16.04.2015)
|
#3
|
|||
|
|||
Код:
buffer[0]:=0x01; buffer[1]:=0x3a; buffer[2]:=0x1a; Так? |
#4
|
||||
|
||||
1. Убери из своей процедуры записи в порт (Procedure WriteStrToPort(Str:String) ; ) строку 8.
2. Вызывай так: WriteStrToPort(#$01#$3A#$1A); 3. Profit Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
sforce (16.04.2015)
|
#5
|
|||
|
|||
Цитата:
Ну да. (10 символов) |
#6
|
|||
|
|||
И уточните, хотя бы для себя, какая версия Дельфи, и String - это AnsiString или WideString ?
|
#7
|
|||
|
|||
Спасибо, вроде отсылает. Теперь следующая проблема)
Устройство, с которым связан компьютер через COM отправляет ответ. И программа его принимает, правда почему-то стабильно через раз (то принимает - то не принимает). НО я так понимаю не может корректно отобразить. Потому что количество принятых байт увеличивается, а memo пополняется лишь одним пробелом. С другим устройством, где передавались данные обычной строкой и без запросов, все работало нормально. Код такой: Код:
Procedure TCommThread.Execute; Begin Repeat QueryPort;//процедура опроса порта будет производиться пока поток не будет прекращен Until Terminated; End; Procedure TCommThread.QueryPort; Var MyBuff:Array[0..1023] Of Char;//буфер для чтения данных ByteReaded:cardinal; //количество считанных байт Str:String; //вспомогательная строка Status:DWord; //статус устройства (модема) Begin //получим статус COM-порта устройства (модема) If Not GetCommModemStatus(hPort,Status) Then Begin {ошибка при получении статуса модема} SysErrorMessage(GetLastError); Exit; End; //читаем буфер из Com-порта FillChar(MyBuff,SizeOf(MyBuff),#0); If Not ReadFile(hPort,MyBuff,SizeOf(MyBuff),ByteReaded,Nil) Then Begin SysErrorMessage(GetLastError); Exit; End; If ByteReaded>0 Then Begin ReciveBytes:=ReciveBytes+ByteReaded; Str:=String(MyBuff); fmMain.Memo1.Text:=fmMain.Memo1.Text+ Str; fmMain.lbRecv.Caption:='Принято: '+IntToStr(ReciveBytes)+' байт...'; End; End; Возможно данная информация поможет: Цитата:
|
#8
|
|||
|
|||
Ну так, насколько я понимаю - к каждому принятому байту нужно $30 прибавить. ЭТо будет типа контрольная сумма. А вообще - не видя ответа, трудно сказать.
|
#9
|
|||
|
|||
Цитата:
И нужна ли 24 строка? Я, если честно, не совсем понимаю здесь функцию филчар. |