【请教】【char】【转换】【16进制】然后【写入串口】

shiguojie19892 2014-03-19 04:46:40

int main()
{
writedata("77 04 00 04 08 0d 0a", 20);
//上面的内容要写入串口设备,是以16进制写入的,请帮我看一下下面的转换哪里出错了?写入后就不显示,调试模式就崩溃
return 1;
}
int C_dev::writedata(char* _data, int _datalen)//写入设备
{
char tempC[20];
char tempH [7] = {'\0'};
int sendH[7];
int i = 0, j = 0;

sprintf(tempC, _data, _datalen);

sscanf(tempC, "%02x %02x %02x %02x %02x %02x %02x",
sendH, sendH+1, sendH+2, sendH+3, sendH+4, sendH+5, sendH+6);

for (i = 0; i < 7; i++)
{
tempH[i] = sendH[i];
}

j = CComm::PortSend(tempH, (sizeof(char)*7));//写入com口(此处调用了一个网上找的串口读写库,没有粘贴完整代码)

if (0 == j)
{
printf("Portsend error!\r\n");
}

return 1;
}
...全文
185 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mangoalx 2014-03-19
  • 打赏
  • 举报
回复
崩溃的原因是你忘了字符串总是需要一个结束符‘\0'的,所以定义字符串缓冲区时千万别忘了至少多分配一个字节 char tempC[20];
shiguojie19892 2014-03-19
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
推荐使用portmon软件辅助调试串口通讯程序。
我有调试串口程序,其实我是想自己写一个,但是还不太理解。
shiguojie19892 2014-03-19
  • 打赏
  • 举报
回复
引用 3 楼 turingo 的回复:
不用那么复杂,字符串直接这样写: "\x77\x04\x00\x04\x08\x0d\x0a" 然后直接发送出去,完全没必要再去转一道了。 [quote=引用 楼主 shiguojie19892 的回复:]

        int main()
{
	writedata("77 04 00 04 08 0d 0a", 20);
       //上面的内容要写入串口设备,是以16进制写入的,请帮我看一下下面的转换哪里出错了?写入后就不显示,调试模式就崩溃
        return 1;
}
int  C_dev::writedata(char* _data, int _datalen)//写入设备
{
	char tempC[20];
	char tempH [7] = {'\0'};
	int sendH[7];
	int i = 0, j = 0;

	sprintf(tempC, _data, _datalen);

	sscanf(tempC, "%02x %02x %02x %02x %02x %02x %02x",
		sendH, sendH+1, sendH+2, sendH+3, sendH+4, sendH+5, sendH+6);

	for (i = 0; i < 7; i++)
	{
		tempH[i] = sendH[i];
	}

	j = CComm::PortSend(tempH, (sizeof(char)*7));//写入com口(此处调用了一个网上找的串口读写库,没有粘贴完整代码)

	if (0 == j)
	{
		printf("Portsend error!\r\n");
	}

	return 1;
}
[/quote] 有更便捷的方法,帮我把这个再翻译回来吗: 得到的数据是: recve 77 0d 00 84 00 45 32 10 32 45 10 45 69 13 解析 头 长度 地址码 命令字 x - 45. 32 y+ 32 . 45 z+ 45 . 69 校验码 下面是我写的解包,请给我一个最优的解包方法
int C_dev::CheckData(char* _data, int _datalen)
{
	if(!_datalen) 
		return 0;
	
	int i=0, j=0;

	char tempH[20] = {0};
	int sendH[20];
	char dataC[15] = {0};
	char signX = '+';
	char signY = '+';

	TIP_HEAD* ntip = NULL;
	bool res = false;

	memcpy(inbuff, _data, _datalen);

	if((0x77 == inbuff[0]) && (0xd == inbuff[1]))
	{		
		for(i = 0; i < _datalen; i++)
		{
			sendH[i] = inbuff[i];
		}

		if (0x00 == inbuff[4])
		{
			signX = '-';
		}
		else
		{			
			signX = '+';
		}

		if (0x00 == inbuff[7])
		{
			signY = '-';
		}
		else
		{			
			signY = '+';
		}

		sprintf(dataC, "X%c%02x.%02x Y%c%02x.%02x",
			signX, inbuff[5], inbuff[6], signY,inbuff[8], inbuff[9]);

		printf("%s\r\n", dataC);
}
七擒关羽 2014-03-19
  • 打赏
  • 举报
回复
"77 04 00 04 08 0d 0a" 看下这个字符串用16进制打印出来就知道了,20字节 每个字符需要自己成16进制 '77' 对应16进制 与你需要得到的是0x77 打印出来是0x37 0x37 空格也算字符的
图灵狗 2014-03-19
  • 打赏
  • 举报
回复
不用那么复杂,字符串直接这样写: "\x77\x04\x00\x04\x08\x0d\x0a" 然后直接发送出去,完全没必要再去转一道了。
引用 楼主 shiguojie19892 的回复:

        int main()
{
	writedata("77 04 00 04 08 0d 0a", 20);
       //上面的内容要写入串口设备,是以16进制写入的,请帮我看一下下面的转换哪里出错了?写入后就不显示,调试模式就崩溃
        return 1;
}
int  C_dev::writedata(char* _data, int _datalen)//写入设备
{
	char tempC[20];
	char tempH [7] = {'\0'};
	int sendH[7];
	int i = 0, j = 0;

	sprintf(tempC, _data, _datalen);

	sscanf(tempC, "%02x %02x %02x %02x %02x %02x %02x",
		sendH, sendH+1, sendH+2, sendH+3, sendH+4, sendH+5, sendH+6);

	for (i = 0; i < 7; i++)
	{
		tempH[i] = sendH[i];
	}

	j = CComm::PortSend(tempH, (sizeof(char)*7));//写入com口(此处调用了一个网上找的串口读写库,没有粘贴完整代码)

	if (0 == j)
	{
		printf("Portsend error!\r\n");
	}

	return 1;
}
赵4老师 2014-03-19
  • 打赏
  • 举报
回复
推荐使用portmon软件辅助调试串口通讯程序。
赵4老师 2014-03-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
FILE *f;
char buffer[4096];
int r,a;
void HexDump(char *buf,int len,int addr) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%08x -",i+addr);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
int main(int argc,char **argv) {
    if (argc<2) {
        fprintf(stderr,"Usage: %s filename.ext\n",argv[0]);
        return 2;
    }
    f=fopen(argv[1],"rb");
    if (NULL==f) {
        fprintf(stderr,"Can not open file [%s]!\n",argv[1]);
        return 1;
    }
    a=0;
    while (1) {
        r=fread(buffer,1,4096,f);
        HexDump(buffer,r,a);
        a+=r;
        if (r<4096) break;
    }
    fclose(f);
    return 0;
}

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧