我用过,你可以参考,如下: 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();
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();
解决方案 »
- dll中调用GDI 初始化的问题
- 怎么设置CSplitterWnd滚动条的滑块宽度/高度???
- bmp 数据读取定位
- 在VC中如何实现将double类型的数转换成CString类型?
- 关于无模式对话框
- 请教内存方面的问题,高手都进来(很难搞定的问题)
- 标签控件CTabCtrl和CPropertySheet/CPropertyPage是什么关系?
- 如何实现softice for dos的复杂(多条件)断点?
- 求助:各位高手LIBCD.lib(wwincrt0.obj) : error LNK2001: unresolved external symbol _wWinMain@16
- 征求实现方案!
- 请问如何检测我的图标是否在系统托盘中?因我的程序只允许运行一次,故希望在APP里检测
- 请问一下,运行平台是UNIX 的程序能不能在2000下运行?
不用别的代码,如果用byte* 怎么能得到长度
HANDLE hFile, //串口句柄
LPCVOID lpBuffer, //数据缓存指针
DWORD nNumberOfBytesToWrite, ////写入数据的字节数
LPDWORD lpNumberOfBytesWriten,
LPOVERLAPPED lpOverlapped
);将CSerialPort类稍改一下,将你写入数据的字节数传给 nNumberOfBytesToWrite 不就行了,遇着0也可以传过去的。
不然就别用这个类了,用别的吧!!
OpenFile
WriteFile 多好用。
不然就别用这个类了,用别的吧!!
OpenFile
WriteFile 多好用。
你改写你下它的发送函数。如someone(阿风) 所说。函数增加一个数据长度参数,。
后面的不要
后面的不要
将缓冲的首地址传给lpBuffer,再将(有意义的数据)你实际要发送数据的长度传给nNumberOfBytesToWrite不就行了。
DWORD dwSize;
WriteFile(hCom, lpBuffer, 4, &dwSize, NULL);//4为你要发送的字节数
要把 int 值传给lpbuffer
int lpBuffer[] = {12, 34, 0, 56};
DWORD dwSize;
WriteFile(hCom, lpBuffer, 2*4, &dwSize, NULL);
DWORD dwSize;
OVERLAPPED ol;
WriteFile(hCom, data, sizeof(data), &dwSize, &ol);
{
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.谁能帮我把这函数搞定呀。分数可以在加
//如: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了。
{
// 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了。
字符串“abcdef\0"
的编码是 41 42 43 44 45 46 00 (不知道对应的,你可以查ASCII码表)
发送到串口字符串"41 42 43 44 45 46 00"
这样就没有绝对的0出现在你的编码中,同时在通信的时候你对截下的数据分析也很方便,可以直接看到对应的码
如果你的数据量足够大的话
有一些串口通信的协议就是用的这种编码