经过2天的折腾终于发现问题在于地址错误,记下来,供参考;
/// <summary>
/// 强制寄存器的命令字符串生成函数;
/// </summary>
private int MakeWriteContactString(string strRegType, int nStartAddr, bool bState)
{
//STX CMD, ADDRESS,ETX,SUM1,SUM2;
m_btOutput[0] = 0x02;
if (bState)
m_btOutput[1] = COMMAND_FORCE_ON;
else
m_btOutput[1] = COMMAND_FORCE_OFF;
int nAddress = GetItemAddress(m_btOutput[1], strRegType, nStartAddr);
string strAddr = Convert.ToString(nAddress, 16).PadLeft(4, Convert.ToChar("0")).ToUpper();
byte[] b = System.Text.Encoding.Default.GetBytes(strAddr);
m_btOutput[4] = b[0];
m_btOutput[5] = b[1];
m_btOutput[2] = b[2];
m_btOutput[3] = b[3];
m_btOutput[6] = ETX;
byte[] btsum = System.Text.Encoding.Default.GetBytes(Convert.ToString(SUM(1, 6), 16)
.PadLeft(2, Convert.ToChar("0")).ToUpper());
m_btOutput[7] = btsum[0];
m_btOutput[8] = btsum[1];
return 9;
}
注意里面的地址:低字节在前,高字节在后;而操作D寄存器的地址时则是高低字节顺序排列;操作D寄存器的数据又是低字节在前高字节在后。