用VC实现多串口多线程工业控制(2)
下面是启动外部控制线程
unsigned int nDummy;
m_pThread=(HANDLE) _beginthreadex(NULL,0,CommThread,this,CREATE_SUSPENDED,&nDummy);//开辟外部控制线程
ResumeThread(m_pThread); 运行线程
外部控制线程控制当前设备发送要数据命令和收到数据报文是否超时
UINT C××××View::CommThread(LPVOID pParam)
{
C××××View *pView = (C××××View *)pParam;
while(1)
{
CTime cNowTime = CTime::GetCurrentTime();
tNow = cNowTime.GetTime();
struct _timeb timebuffer;
_ftime(&timebuffer);
int nNowMillSecond = timebuffer.millitm;
///
tLast = cLastColtTime[0].GetTime();
if((tNow - tLast)*1000 + (nNowMillSecond - nMillSecond[0]) > 800)
pView->SetCommVal();发送下一台设备要数据命令或者进行其他的相关处理
Sleep(100);
}
}
发送串口数据命令,这里要根据外部设备的制定的通讯协议来进行。这次温度表采用的是ASCII的形式通讯。
void C××××View::SetCommVal()
{
int HAddr,LAddr,m_Xnh;
int nHAdd,nLAdd;
nHAdd = ExchangeAscII((nColtAddr>>4)&0x0f);
nLAdd = ExchangeAscII(nColtAddr&0x0f);
m_Xnh = nHAdd^nLAdd^0x52^0x44;
HAddr = ExchangeAscII((m_Xnh>>4)&0x0f);
LAddr = ExchangeAscII(m_Xnh&0x0f);
BYTE OutBuff[8] = {0x40,nHAdd,nLAdd,0x52,0x44,HAddr,LAddr,0x0d};
m_Ports.WriteToPort(OutBuff,8);
cLastColtTime = CTime::GetCurrentTime();
nColtAddr++;
if(nColtAddr > 19)//19 define max addr numbers
nColtAddr = 0;
}
ASCII码的一些简单变换,我们进行一下简单的封装,方便调用:
BYTE C××××View::ExchangeAscII(BYTE bInput)
{
BYTE bRef = 0;
if(bInput > 9)
bRef = bInput+0x37;
else
bRef = bInput+0x30;
return bRef;
}
BYTE C××××View::ExchangeAscIItoNormal(BYTE bInput)
{
BYTE bRef = 0;
if(bInput > 0x39)
bRef = bInput-0x37;
else
bRef = bInput-0x30;
return bRef;
}