我对 Modbus 协议完全陌生。我的设置由三个具有不同地址的设备组成。它们都通过 RS232 连接到 COM1。我使用 Modbus Poll 来检查输入数据,它工作正常。我现在要做的是读取 vc++ (MFC) 应用程序中的保持寄存器。对于串行通信,我使用 MSComm 类。我写了一些代码,但我根本没有输入。
我目前的代码:
BOOL Crs232test4Dlg::OpenConnection ()
{
char error [513];
try
{
if (! m_MSComm.GetPortOpen ())
{
m_MSComm.SetCommPort (1);
m_MSComm.SetSettings ("9600,N,8,1");
m_MSComm.SetInputLen (4);
// Receive Data as Text
m_MSComm.SetInputMode (0);
m_MSComm.SetPortOpen (true);
m_MSComm.SetCommID (1);
return m_MSComm.GetPortOpen ();
}
AfxMessageBox ("Success!!!!", MB_OK);
return TRUE;
}
catch (CException *e)
{
e->GetErrorMessage (error, 512);
AfxMessageBox (error, MB_OK);
return FALSE;
}
}
void Crs232test4Dlg::OnVaisalaComm ()
{
if (m_MSComm.GetCommEvent () == 2)
{
COleVariant in_dat;
in_dat = m_MSComm.GetInput ();
Sleep (100);
CString strInput (in_dat.bstrVal);
m_Input = m_Input + strInput;
UpdateData (FALSE);
}
}
我现在想推出 m_Input,但它并没有改变一点。在设置 SetCommID 时,我也会收到警告(属性是只读的),我认为这并不重要。
谁能指导我,因为我现在真的一无所知。
问候
编辑:根据一个通信示例,我试图像处理文件一样处理设备。
m_hCom = CreateFile(m_sComPort,
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security
OPEN_EXISTING,
0, // no overlapped I/O
NULL); // null template
// :(colon) Address=1 Function=3 Starting register= 40001 (To write 400001 or 0?)
Registers to read=4 checksum CR LF
char strASCII[] = "3A 30 31 30 33 30 30 30 30 30 30 30 34 46 38 0D 0A";
bWriteRC = WriteFile (m_hCom, strASCII, strlen(strASCII), &iBytesWritten, NULL);
memset(sBuffer,0,sizeof(sBuffer));
// Reading output of the M3
bReadRC = ReadFile (m_hCom, &sBuffer, 1, &iBytesRead, NULL);
if (bReadRC && iBytesRead > 0)
{
sResult = sBuffer;
}
else
{
sResult = "Read Failed";
dwError = GetLastError();
sprintf(sMsg, "Read length failed: RC=%d Bytes read=%d, "
"Error=%d ",
bReadRC, iBytesRead, dwError);
AfxMessageBox(sMsg);
}
我收到读取长度失败错误。strASCII 不正常分离,现在只是为了更好地概述。我已经检查了 Modbus Poll 中的通信。我的输出是正确的,但它似乎没有得到数据。
编辑:我明白了。非常感谢您的帮助。我输入了错误的校验和。