這就是輪詢com口的所有代碼,根據modbus-RTU協議,設備沒有回應。我不知道如何讓設備回應我。設備地址和功能碼足以回答。這是前兩個字符(0x15、0x03 ...)我不知道我做錯了什么!
有一個代碼:
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <TCHAR.h>
using namespace std;
#pragma warning(disable:4996)
//обработчик COM порта
HANDLE hSerial;
//название порта
LPCTSTR sPortName = L"COM3";
int ReadCOM()
{
int a = 0;
DWORD iSize;
char sReceivedChar = { 0 };
char recBuf[100] = { 0 };
recBuf[0] = '\0';
while (!a)
{
//получение ответа
ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0); // получаем 1 байт
if (iSize > 0) // если что-то принято, выводим
{
cout << "Answer: " << sReceivedChar;
strcat(recBuf, &sReceivedChar);
}
else
{
cin >> a;
}
}
CloseHandle(hSerial);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
//настройка параметров соединения (В данном случае COM порта)
DCB *dcbSerialParams = (DCB*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DCB));;
dcbSerialParams->DCBlength = sizeof(dcbSerialParams);
if (BuildCommDCB(L"baud=9600 parity=E data=8 stop=2", dcbSerialParams))
{
std::cout << "success 1" << std::endl;
}
else
{
std::cout << "failure 1" << std::endl;
}
dcbSerialParams->fNull = TRUE;
//установка таймаута приема и передачи порта
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 1000;
CommTimeOuts.ReadTotalTimeoutConstant = CommTimeOuts.ReadTotalTimeoutMultiplier = 100;
CommTimeOuts.WriteTotalTimeoutConstant = CommTimeOuts.WriteTotalTimeoutMultiplier = 100;
//открытие порта для чтения/записи
hSerial = CreateFile(sPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
//проверка роботоспособности (не работает)
if (hSerial == INVALID_HANDLE_VALUE)
{
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{
cout << "wrn::Serial port does NOT exist.\n";
}
else
{
cout << "wrn::Some other error occurred.\n";
}
}
//(работает) пишем соответствующее сообщение
else
{
cout << "suc::Serial port DOES exist.\n";
}
//запись свойств порта
if (!SetCommState(hSerial, dcbSerialParams))
{
cout << "faulure 2" << endl;
}
if (!SetCommTimeouts(hSerial, &CommTimeOuts))
{
cout << "failure 3" << endl;
}
//Освобождение DCB
HeapFree(GetProcessHeap(), 0, dcbSerialParams);
//char data[] = { 0x15, 0x03, 0x6B, 0x03, 0x37, 0x7E };
char data[] = { 0x15, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
DWORD dwSize = sizeof(data); // размер этой строки
DWORD dwBytesWritten; // тут будет количество собственно переданных байт
BOOL iRet = WriteFile(hSerial, data, dwSize, &dwBytesWritten, NULL);
//нормальная работа
if (iRet)
{
cout << "nor :: " << dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl;
}
//ошибка передачи
else
{
cout << "wrn :: " << "db = " << dwBytesWritten << "\nds = " << dwSize << endl;
}
ReadCOM();
return 0;
}
uj5u.com熱心網友回復:
您是否使用終端程式 fe 檢查了您的請求字串hterm?據我所知,只有兩個 tx 字符不會從設備上做出回答,幀末尾還有一個 crc
https://www.der-hammer.info/pages/terminal.html
uj5u.com熱心網友回復:
您不需要堆分配 DCB;只需使用堆疊變數。此外,您正在使用sizeof指標,因此DCBlength不會相應地填充該欄位。只需執行以下操作:
DCB dcbSerialParams = { 0 };
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (BuildCommDCB(L"baud=9600 parity=E data=8 stop=2", &dcbSerialParams))
....
同樣在 ReadCOM 中,雖然DWORD iSize;是一個 OUT 引數,但您應該將其初始化為零以避免在除錯時出現潛在的運行時錯誤(“變數 x 使用時未初始化”)
uj5u.com熱心網友回復:
錯誤在校驗和中,感謝您的幫助。
char data[] = { 0x15, 0x03, 0x00, 0x00, 0x00, 0x01, **0x87**, **0x1E**};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368484.html
上一篇:我想為收銀機進行收款,每當插入公司收款時,收款機都會存盤帶有每個公司收款ID的資料
下一篇:為什么當我在IA32_LSTARMSR上為SYSCALL使用內核除錯器在Windows64位上設定斷點時會出現DoubleFault?(KVASCODE部分)
