CH发送和接收数据函数使用说明之打开设备和发送
1打开设备
HANDLEWINAPICHOpenDevice(//打开CH设备,返回句柄,出错则无效
ULONGiIndex);//指定CH设备序号,0对应第一个设备,-1则自动搜索一个可以被打开的设备并返回序号
如调用
CHOpenDevice(0);//默认的是打开第一个设备,如果你只有一个设备的话依次类推即可
一般使用之前先保证设备是打开的,再进行数据的接收和发送
2发送数据
BOOLWINAPICHWriteData(//写出数据块
ULONGiIndex,//指定CH设备序号
PVOIDiBuffer,//指向一个缓冲区,放置准备写出的数据
PULONGioLength);//指向长度单元,输入时为准备写出的长度,返回后为实际写出的长度
发送调用例程如下:
定义相关的数据结构体:
typedefstructtagCANMsg
{
UINT32sendID;//发送/接收ID
UINT8IDE;//是否为扩展ID格式(=0为标准11位ID,=1为扩展29位ID)
UINT8RTR;//是否为远程帧(=0发送数据帧,=1远程发送请求)
UINT8data[8];//帧数据
UINT8dataLen;//帧数据长度
UINT8priority;//发送优先极(数据越小优先级越高,可以选择0,1,2)
}CANMsg;//这个是can板上固定的数据结构,如果使用的不是,就不用这个结构体
typedefunion{
UCHARdata[16];
CANMsgmyStruct;
}testUionCan;
CHWriteData(0,tSendData.data,iSendLenth)
即传入要发送的设备号,数据和数据长度即可
数据结构根据自己的需要进行相关的定义即可
代码举例:
对于发送数据的操作,应先调用CHSetBufDownload()函数后,在去调用CHWriteData方法进行写数据。
CANMsgmsg;
msg.sendID=1;
msg.data[0]=0x2B;
msg.data[1]=0x47;
msg.data[2]=0x18;
msg.data[3]=0x48;
msg.data[4]=0x05;
msg.data[5]=0x00;
msg.data[6]=0x00;
msg.data[7]=0x00;
msg.dataLen=8;
msg.RTR=0;
msg.priority=1;
msg.IDE=0;
if(CHSetBufDownload(0,1)){
if(CAN_STATE)
bRet=CHWriteData(0,(void*)msg,iSendLength);
if(bRet){
//发送完,直接读取
CANMsguDataTemp;
uDataTemp.sendID=1;
uDataTemp.IDE=0;
uDataTemp.priority=1;
uDataTemp.RTR=0;
uDataTemp.dataLen=8;
ULONGRxLength=16;
if(CHSetBufUpload(0,1)){
bReadSuccess=CHReadData(0,(void*)uDataTemp,RxLength);
if(bReadSuccess){
CANMsg*p=(CANMsg*)uDataTemp;
}}}}