![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день. Помогите, пожалуйста, по следующему вопросу.
У меня данные типа 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 строка? Я, если честно, не совсем понимаю здесь функцию филчар. |