mraaf Ответов: 2

Как установить связь и отправить аргументы в infenion C167CS


Здравствуйте Эксперты,
Я пытаюсь установить связь и активировать цифровые выходы микроконтроллера C167CS. Однако отправка команды
"SetXDO 1 1"
с помощью
WriteFile()
похоже, он не работает и не возвращает никаких ошибок.

Несмотря на это,
"SetXDO 1 1"
работает с помощью Гипертерминала.

Оцените, если кто-то может точно указать на проблему или предложить решение.

Заранее спасибо.

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

	CSerialPort *serial = new CSerialPort;
CXTSimulatorDlg *pXTS = (CXTSimulatorDlg*)GetParent();
DWORD dwBaudRate = 115200;
BYTE byteDataBits = 8;
DWORD dwBytesTx = 0;

LPCTSTR pTx = "SetXDO 1 1";

		if(serial->OpenPort(pXTS->m_strComboCOMPorts))
		{
			if(serial->ConfigurePort(dwBaudRate, byteDataBits, 0, NOPARITY, ONESTOPBIT))
			{
				if(serial->SetCommunicationTimeouts(0, 100, 0, 0, 0))
				{
					if(WriteFile(serial->m_hComm, &pTx, 1, &dwBytesTx, 0))
					{
						if(dwBytesTx == 0)
							MessageBox("Timeout on getting response.", 
							"Transmitting Data...", 
							MB_ICONWARNING);
					}
					else
					{
						CString strError;
						DWORD dwError = GetLastError(); // get last error code
						strError.Format("%d", dwError);
						MessageBox("No byte transferred!\nError Code: " + strError, "Transmitting Data...", MB_ICONINFORMATION);
					}
				}
				else
					MessageBox("Communication Timeouts.", "Transmitting Data...", MB_ICONWARNING);
			}
			else
				MessageBox("Cannot configure communication port.", "Transmitting Data...", MB_ICONWARNING);

2 Ответов

Рейтинг:
4

Patrice T

DWORD dwBytesTx = 0;
LPCTSTR pTX = "SetXDO 1 1";
...
WriteFile(serial->m_hComm, &pTx, 1, &dwBytesTx, 0)

При первом взгляде вы должны убедиться, что не говорите, что длина равна 0.

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Рейтинг:
17

Jochen Arndt

Прочтите документацию по использованному Функция WriteFile (Windows)[^]:

Цитата:
nNumberOfBytesToWrite [in]

Количество байтов, записываемых в файл или устройство.
Вы передаете "1", так что будет записан только один символ. Вы должны написать все символы. Воспользуйся strlen() вместо.

Это может привести к следующей проблеме. Я предполагаю, что устройство ожидает символов ASCII. Но ваша строка имеет тип LPCTSTR который представляет собой широкую строку со сборками Unicode. Так что вы должны использовать LPCSTR вместо.

Наконец, может возникнуть необходимость отправить также перевод строки и / или возврат каретки. Это зависит от спецификации команды вашего устройства.

[РЕДАКТИРОВАТЬ]
Просто нашел еще одну ошибку. pTx это уже указатель, так что адрес оператора должен быть удален. Обновлено ниже кода.
[/РЕДАКТИРОВАТЬ]

Так что используйте:
LPCSTR pTx = "SetXDO 1 1\r\n";
// Or:
//LPCSTR pTx = "SetXDO 1 1\n";
// Or:
//LPCSTR pTx = "SetXDO 1 1";

// ...
WriteFile(serial->m_hComm, pTx, strlen(pTx), &dwBytesTx, 0)


CPallini

5.

mraaf

- Да, спасибо. Я удалил его, и теперь он работает.
Ценить это.

Спасибо снова