Wince(evc) can 总线 通信 SPI MCP2510

wingslee   2010-1-9 11:36 楼主
下面的代码我研究了两个礼拜了,有几处还是不明白,希望大家能不吝赐教。
代码两部分分别是发送按钮和接收线程。

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;
}

回复评论 (3)

帮顶下。
点赞  2010-1-9 11:57
没人会啊?
点赞  2010-1-11 18:36
做过can但是忘记了,呵呵。帮顶。
点赞  2010-1-11 18:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复