Member 12278335 Ответов: 2

Как отправить строку через последовательный порт...?


Я хочу отправить строку через последовательный порт, который я пытался отправить
char lpBuffer[] = "100001111";
я мог бы отправить его успешно. но когда я пытаюсь ниже, я получаю сумасшедший результат. Какой метод я могу использовать?..

Что я уже пробовал:

void setDataToPort(string strData)
{
	BOOL   Status;

	//char lpBuffer[] = "100001111";
	
	string mStr = "100001111";
	
	string *srData = &mStr;

	DWORD dNoOFBytestoWrite;         // No of bytes to write into the port
	DWORD dNoOfBytesWritten = 0;     // No of bytes written to the port
	dNoOFBytestoWrite = sizeof(*srData);
	
	

	Status = WriteFile(hComm,        // Handle to the Serial port
		(LPCVOID*)srData,     // Data to be written to the port
		dNoOFBytestoWrite,  //No of bytes to write
		&dNoOfBytesWritten, //Bytes written
		NULL);
	
// I am getting below results
/*

Hö†.100001111.ÌÌÌÌÌÌ........Hö†.100001111.ÌÌÌÌÌÌ........hý†.100001111.ÌÌÌÌÌÌ........hý†.100001111.ÌÌÌÌÌÌ........ý†.100001111.ÌÌÌÌÌÌ........ý†.100001111.ÌÌÌÌÌÌ.........õ†.100001111.ÌÌÌÌÌÌ........

*/



}

2 Ответов

Рейтинг:
7

Jochen Arndt

Нет необходимости использовать строковые классы C++. Просто использовать char вместо этого-буферы. Это позволяет избежать проблем с широкими строками символов (например, CString с МФЦ). При использовании классов using string используйте соответствующие функции для доступа к символам (например, string::c_str).

Избегайте использования вспомогательных переменных и приведений. Это делает код нечитаемым и подверженным ошибкам (количество символов, которые должны быть записаны в вашем случае).

Это должно сделать работу:

char lpBuffer[] = "100001111";
DWORD dNoOFBytestoWrite;
// You have to pass the number of characters to be written.
// sizeof() of would only work with byte arrays of fixed size when
//  all array items are initialised.
DWORD dNoOfBytesWritten = strlen(lpBuffer);
Status = WriteFile(hComm, lpBuffer, dNoOFBytestoWrite, &dNoOfBytesWritten, NULL);

Но я думаю, что вы все равно получите результат, похожий на тот, который показан в вашем вопросе. Похоже, что вы получаете данные и не добавляли нулевой байт перед печатью полученных данных, так что функция печати не может определить конец строки. Возможным решением была бы отправка также нулевого байта:
DWORD dNoOfBytesWritten = strlen(lpBuffer) + 1;
Но это довольно необычно при последовательной связи с использованием печатаемых символов. Вместо этого измените функцию приема, чтобы добавить нулевой байт, когда больше нет данных.