一.所需硬件设备
1.IPCSUN公司的CNET100
2.珠海创芯/广成科技的CAN分析仪
二.软件在环测试连接框架
三.测试代码及结果
#include<WINSOCK2.H>
#include<STDIO.H>
#include<iostream>
#include<cstring>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996)
int StringToHex(char* str, unsigned char* out, unsigned int* outlen);
int main()
{
WORD sockVersion = MAKEWORD(2, 2);
WSADATA data;
if (WSAStartup(sockVersion, &data) != 0)
{
return 0;
}
while (true) {
SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sclient == INVALID_SOCKET)
{
printf("invalid socket!");
return 0;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(8888);
serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.50");
if (connect(sclient, (sockaddr*)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{ //连接失败
printf("connect error !");
closesocket(sclient);
return 0;
}
printf("start\n");
while (true)
{
printf("input:\n");
char readData[255];
char sData[255];
cin.getline(readData, 255);
if (strlen(readData) <= 0)
continue;
else
{
int j = 0;
for (int i = 0; i < strlen(readData); i++)
if (readData[i] != ' ')
sData[j++] = readData[i];
sData[j] = 0;
}
unsigned char sendData[255];
unsigned int ioutlen = 0;
StringToHex(sData, sendData, &ioutlen);
send(sclient, (char*)sendData, ioutlen, 0);
//send()用来将数据由指定的socket传给对方主机
//int send(int s, const void * msg, int len, unsigned int flags)
//s为已建立好连接的socket,msg指向数据内容,len则为数据长度,参数flags一般设0
//成功则返回实际传送出去的字符数,失败返回-1,错误原因存于error
char recData[255];
memset(recData, 0, sizeof(recData));
int ret = recv(sclient, recData, 255, 0);
int a = 0;
printf("output\n");
for (int i = 0; i <ret; i++) {
if (ret == 0)
{
printf("output\n");
return 0;
}
if (ret > 0)
{
printf("%02x ", recData[i] & 0xFF);
a = sizeof(recData[i]);
uint8_t tmp_2 = recData[i];// & 0xFF;
}
}
printf("\n");
//printf(recData);
//}
}
closesocket(sclient);
}
WSACleanup();
return 0;
}
int StringToHex(char* str, unsigned char* out, unsigned int* outlen)
{
char* p = str;
char high = 0, low = 0;
int tmplen = strlen(p), cnt = 0;
tmplen = strlen(p);
while (cnt < (tmplen / 2))
{
high = ((*p > '9') && ((*p <= 'F') || (*p <= 'f'))) ? *p - 48 - 7 : *p - 48;
low = (*(++p) > '9' && ((*p <= 'F') || (*p <= 'f'))) ? *(p)-48 - 7 : *(p)-48;
out[cnt] = ((high & 0x0f) << 4 | (low & 0x0f));
p++;
cnt++;
}
if (tmplen % 2 != 0) out[cnt] = ((*p > '9') && ((*p <= 'F') || (*p <= 'f'))) ? *p - 48 - 7 : *p - 48;
if (outlen != NULL) *outlen = tmplen / 2 + tmplen % 2;
return tmplen / 2 + tmplen % 2;
}
通过程序下发CAN报文指令,用CAN工具可以看到接收数据,同时用CAN分析仪上位机下发指令,程序可以接收对应的CAN报文信息。