串口通讯数码问题?(急,保证送分)

delphihero 2002-03-20 09:37:58
用CSerialPort 类进行串口通讯,他发送的是 char* sting 类型,就是字符型。我想用16进制,可16进制里的0正好是null是字符串的结束字符,特别是好多0同时出现
该怎么办??
...全文
142 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
seamanhailing 2002-03-26
  • 打赏
  • 举报
回复
自己用Api函数写吧
youwill 2002-03-24
  • 打赏
  • 举报
回复
告诉你一种专业的解决方案
字符串“abcdef\0"
的编码是 41 42 43 44 45 46 00 (不知道对应的,你可以查ASCII码表)
发送到串口字符串"41 42 43 44 45 46 00"
这样就没有绝对的0出现在你的编码中,同时在通信的时候你对截下的数据分析也很方便,可以直接看到对应的码
如果你的数据量足够大的话
有一些串口通信的协议就是用的这种编码

zjh 2002-03-24
  • 打赏
  • 举报
回复
函数的入口加个长度的参数,不行吗?
不管它字符串中的是什么东西,一直处理完那么长才结束。
sxslyy 2002-03-24
  • 打赏
  • 举报
回复
9.在接收框中以十六进制显示

这就容易多了: 在主对话框中加入一个复选接钮,IDC_CHECK_HEXDISPLAY Caption: 十六进制显示,再利用ClassWizard为其添加控制变量:m_ctrlHexDiaplay。 然后修改CSCommTestDlg::OnComm()函数:

void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
if(m_ctrlHexDisplay.GetCheck())
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
else
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
}

测试:在串口调试助手发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在本程序运行后选上以十六进制显示,在串口调试助手中单击手动发送或自动发送,则在本程序的接收框中应该可以看到00 01 02 03 A1 CC了。

sxslyy 2002-03-24
  • 打赏
  • 举报
回复
8.发送十六进制字符

在主对话框中加入一个复选接钮,ID为IDC_CHECK_HEXSEND Caption: 十六进制发送,再利用ClassWizard为其添加控制变量:m_ctrlHexSend;

在ClassView中为SCommTestDlg类添加以下两个PUBLIC成员函数,并输入相应代码;

 

//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
//如:A1 23 45 0B 00 29
//CByteArray是一个动态字节数组,可参看MSDN帮助
int CSCommTestDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}

//这是一个将字符转换为相应的十六进制值的函数
//好多C语言书上都可以找到
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CSCommTestDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}

 

再将CSCommTestDlg::OnButtonManualsend()修改成以下形式:

void CSCommTestDlg::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
if(m_ctrlHexSend.GetCheck())
{
CByteArray hexdata;
int len=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据
}
else
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据

}


现在设置好相应串口,然后运行我们这个程序,在发送框中输入00 01 02 03 A1 CC等十六进制字符,并选上以十六进制发送,单击手动发送,在串口调试助手的接收框中应该可以看到00 01 02 03 A1 CC了。

 
delphihero 2002-03-21
  • 打赏
  • 举报
回复
里面就是 openfile 和 writefile 接受方部可能改变.
ahr 2002-03-21
  • 打赏
  • 举报
回复
我没用过这个类。要是遇到0就结束,你把所有的BYTE都加1发送,接受方收到再减1不就行了。但最大值要小于0xff
不然就别用这个类了,用别的吧!!
OpenFile
WriteFile 多好用。
ahr 2002-03-21
  • 打赏
  • 举报
回复
我没用过这个类。要是遇到0就结束,你把所有的BYTE都加1发送,接受方收到再减1不就行了。但最大值要小于0xff
不然就别用这个类了,用别的吧!!
OpenFile
WriteFile 多好用。
someone 2002-03-21
  • 打赏
  • 举报
回复
WriteFile 中不是可以指定写入数据的长度吗?

WriteFile(
HANDLE hFile, //串口句柄
LPCVOID lpBuffer, //数据缓存指针
DWORD nNumberOfBytesToWrite, ////写入数据的字节数
LPDWORD lpNumberOfBytesWriten,
LPOVERLAPPED lpOverlapped
);

将CSerialPort类稍改一下,将你写入数据的字节数传给 nNumberOfBytesToWrite 不就行了,遇着0也可以传过去的。
delphihero 2002-03-21
  • 打赏
  • 举报
回复
分不开。遇到0就结束了
llb2000 2002-03-21
  • 打赏
  • 举报
回复
用strcpy把串口缓冲区里的数据度出来看看,应该是把字符串结束标志\0和数字0区分开了的
delphihero 2002-03-21
  • 打赏
  • 举报
回复
都不着边,sigh
不用别的代码,如果用byte* 怎么能得到长度
tw_cshn 2002-03-21
  • 打赏
  • 举报
回复
我用过,你可以参考,如下:

CStdioFile Cfiler;
Cfiler.Open(_T("D:\\COM程序\\数据\\CELL1700-3.txt"),CFile::modeRead);
DWORD dwRead,dwPoslen=0,dwFileLen;
char cRead;
CString test;
dwFileLen=Cfiler.GetLength();
while(dwPoslen<dwFileLen)
{
Cfiler.Read(&dwRead,1);
cRead=(char)dwRead;
test=cRead;
m_ctrlComm.SetOutput(COleVariant(test));
dwPoslen+=1;
Cfiler.Seek(dwPoslen,CFile::begin);
}
Cfiler.Close();
meteorsword 2002-03-21
  • 打赏
  • 举报
回复
不是还可以指定字符串的长度吗?实在不行也可以自己在程序中转换一下
delphihero 2002-03-21
  • 打赏
  • 举报
回复
两个有什么区别,c学的不是太好。
delphihero 2002-03-21
  • 打赏
  • 举报
回复
有人知道吗??
delphihero 2002-03-21
  • 打赏
  • 举报
回复
char CComtestView::ConvertCharTohex(char ch)
{
if(ch>='0'&&ch<='9')
return ch-0x30;
else if(ch>='A'&&ch<='F')
return ch-'A'+10;
else if(ch>='a'&&ch<='f')
return ch-'a'+10;
else
return -1;
}
int CComtestView::String2Hex(CString str,char *hexstr)
{
/* if((Total % 2) != 0)
{
strcat((char *)lpBuffer,"0");
Total ++;
}
unsigned char HexBuffer[1024];
memset(HexBuffer,'\0',1024);
int i ;
for( i = 0 ; i < Total ; i++)
{
if(lpBuffer[i] > 0x39)
lpBuffer[i] -= 0x37 ;
else
lpBuffer[i] -= 0x30 ;
}
for(i=0 ; i < Total ; i+=2)
{
HexBuffer[i/2] = lpBuffer[i] ;
HexBuffer[i/2] <<= 4;
HexBuffer[i/2] |= lpBuffer[i+1];
}
memcpy(lpBuffer,HexBuffer,Total/2);

*/
int i,len,n=0;
char lowstr,highstr;
len=str.GetLength();
for(i=0;i<len;i++)
{
if(str[i]==' ')
{
continue;
}
highstr=ConvertCharTohex(str[i]);
if(highstr>=0&&highstr<=16)
{
hexstr[n]=str[i];
hexstr[n]<<=4;
i++;
lowstr=ConvertCharTohex(str[i]);
if(lowstr>=0&&lowstr<=16)
{
hexstr[n]|=lowstr;//如果是highstr,lowstr 都是0这个字符串就结束了.不再接受其他的字符
n++;
}
}
else
{
AfxMessageBox("超出数字范围");
}
}
return true;
}
Saimen(全拼) 的程序我试了试也存在00H bug.谁能帮我把这函数搞定呀。分数可以在加
someone 2002-03-21
  • 打赏
  • 举报
回复
BYTE data[] = {0x12, 0x34, 0x00, 0x56};
DWORD dwSize;
OVERLAPPED ol;
WriteFile(hCom, data, sizeof(data), &dwSize, &ol);
ahr 2002-03-21
  • 打赏
  • 举报
回复
//例如 12,34,0, 56 这4个数, 每个占2字节
int lpBuffer[] = {12, 34, 0, 56};
DWORD dwSize;
WriteFile(hCom, lpBuffer, 2*4, &dwSize, NULL);


delphihero 2002-03-21
  • 打赏
  • 举报
回复
lpbuffer 怎么赋值??要传int型数据
加载更多回复(12)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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