下面的代码我研究了两个礼拜了,有几处还是不明白,希望大家能不吝赐教。
代码两部分分别是发送按钮和接收线程。
void CCanDlg::OnButton2()
{
// TODO: Add your control notification handler code here
int i,k;
unsigned char temp_data[1024];
DWORD length;
temp_data[0] = 0xa5; //标识符ID的低位。//这里是发送数据定义的标识符ID,共4个字节,用后面的代码计算转换后应该是ID:05a5,但接收线程只接收05a4啊,这是怎么回事?
temp_data[1] = 0x05;
temp_data[2] = 0x00;
temp_data[3] = 0x00; //标识符ID的高位。
UpdateData(TRUE);
i = m_TX_EDIT.GetAllocLength();//得到输入的字符串的长度。
for(k=0;k
{
temp_data[k+4] = (unsigned char)(m_TX_EDIT.GetAt(k) & 0xff);//因为头4个事ID,所以从数组的第五位开始存储要发送的数据。
}
WriteFile(hStr,temp_data,i,&length,&m_osWrite); //这句是发送语句,为什么只发送i个字节,而不是发送i+4个呢?
temp_data[0] = 0xa4; //标识符ID的低位。//这里为什么又定义标识符?这个标识符05a4,和接收线程所接受的是一样的。
temp_data[1] = 0x05;
temp_data[2] = 0x00;
temp_data[3] = 0x00; //标识符ID的高位。
WriteFile(hStr,temp_data,7,&length,&m_osWrite); //这里发送的是什么?为什么只发送7位?
UpdateData(FALSE);
}
int ccount = 0;
//CAN_Bus接收线程函数
DWORD RXINT_Thread(PVOID pArg)
{
unsigned int i,k;
int rxid;
unsigned char temp_data[1024];
DWORD length;
CString str1;
CCanDlg *pWnd = (CCanDlg*)pArg;//指针,这样线程里可以调用updatadate等。
while(1)
{
//读取的长度必需12的倍数,如120,240等等。因为一个数据帧为12个字节,
//前面4个是标识符ID,后面8个是数据。
ReadFile(hStr,temp_data,240,&length,&m_osRead);
rxid = 0;
if(length)
{
for(i=0;i
{
//读取标识符到rxid;
rxid = temp_data[i*12] + temp_data[(i*12)+1]*0x100;
rxid = rxid + temp_data[(i*12)+2]*0x10000 + temp_data[(i*12)+3]*0x1000000;//将数组tempdate头4位ID,转换成rxid的形式然后判断。
if(rxid == 0x05a4)
{
ccount = 0;
str1= rx_data;
pWnd->UpdateData(TRUE);
m_RX_EDIT= m_RX_EDIT + str1;
memset(rx_data,0,sizeof(rx_data));
pWnd->UpdateData(FALSE);
break;
}
for(k=4;k<12;k++) //读取每帧里的数据到rx_data,即去除标识符。//我认为应该吧这个for放到if(rxid == 0x05a4)里,不然str1= rx_data;就没有数据了。但是实验证明那样做不对,源代码没错。
{
rx_data[ccount++] = temp_data[(i*12)+k];
}
}
memset(temp_data,0,sizeof(temp_data));//相当于清零。
}
Sleep(3); //加延时
}
return 0;
}