请教:改变串口发送数据的格式(长度)

zhangyu1900 2010-02-06 11:50:30
大家好,小弟现在调试的串口程序进行简单的收发数据没有什么问题,比如我发送“A”,以ASCII码显示的话在串口另一端可以收到“A”, 问题在于此时发送的A对应的十六进制数是41 00,我希望发送的“A”是十六进制数41,感觉把数据类型改为字节型就可以解决了,但是总是改不对,还望大家给予指导,谢谢啦

发数部分的程序代码:

DWORD WINAPI SendThread (PVOID pArg) {
HWND hWnd, hwndSText;
int rc;
DWORD cBytes;
WCHAR szText[TEXTSIZE];
char szAnsi[TEXTSIZE];
size_t siz;

hWnd = (HWND)pArg;
hwndSText = GetDlgItem (hWnd, ID_SENDTEXT);
while (1) {
rc = WaitForSingleObject (g_hSendEvent, INFINITE);
if (rc == WAIT_OBJECT_0) {
if (!fContinue)
break;
// Disable send button while sending.
EnableWindow (GetDlgItem (hWnd, ID_SENDBTN), FALSE);

// Get the text, terminate the line and convert to ansi
GetWindowText (hwndSText, szText, dim(szText));
StringCchCat (szText, dim(szText), TEXT ("\r\n"));
wcstombs_s (&siz, szAnsi, sizeof (szAnsi), szText, _TRUNCATE);

// Write to the serial port
rc = WriteFile (hComPort, szText,
lstrlen (szText)*sizeof (TCHAR),&cBytes, 0);
if (rc) {
// Copy sent text to output window.
SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL, 0,
(LPARAM)TEXT (" >"));
SetWindowText (hwndSText, TEXT ("")); // Clear text box
} else {
// Else, print error message.
wsprintf (szText, TEXT ("Send failed rc=%d\r\n"),
GetLastError());
DWORD dwErr = 0;
COMSTAT Stat;

if (ClearCommError (hComPort, &dwErr, &Stat)) {
printf ("fail\n");
}
}
// Put text in receive text box.
SendDlgItemMessage (hWnd, ID_RCVTEXT, EM_REPLACESEL, 0,
(LPARAM)szText);
EnableWindow (GetDlgItem (hWnd, ID_SENDBTN), TRUE);
} else
break;
}
return 0;
}
...全文
240 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyu1900 2010-02-21
  • 打赏
  • 举报
回复
问题已解决,就是转换ASCII码的问题,谢谢大家啦,结贴发分喽
skynet000 2010-02-08
  • 打赏
  • 举报
回复
因为wince上层一般都是用unicode字符,楼主的意思是想将unicode改为Ascii码,再用串口发送?
如果楼主仅仅只有字符和数字等字符串的话。那就比较简单了。因为对于字符和数字来说,仅仅是将1byte变成2byte宽度,前面补零。
即:'A'的ASCII为0x41, 它的UNicode为0x0041
这样吧前面的00去掉,就可以转成ASCII码了。
char Ascbuf[[100];
for(i=0;i<lstrlen(szText);i++)
{
Ascbuf[i] = (char)szText[i];
}
wolfmvp 2010-02-07
  • 打赏
  • 举报
回复
学习,学习,呵呵。
zhangyu1900 2010-02-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yangcuncunzhang 的回复:]
// Write to the serial port
            rc = WriteFile (hComPort, szText,
                            lstrlen (szText)*sizeof (TCHAR),&cBytes, 0);


楼主,你发送时用的szText,是TCHAR类型的,而发送长度又是sizeof (TCHAR)计算出来的,sizeof(TCHAR)是返回字节数的,所以是2,当你输入一个A时,发送的就是41 00啦。
[/Quote]

的确如您所说的那样,小弟是个菜鸟,不怕大家笑话,我试着修改了szText的数据类型,现在的问题是这样的话数据类型与接下来的函数GetWindowText (); StringCchCat (); wcstombs_s (); 中的参数需要的数据类型就不符了,可以更改函数中参数的默认类型么?望大家指点,谢谢啦
yangcuncunzhang 2010-02-07
  • 打赏
  • 举报
回复
// Write to the serial port
rc = WriteFile (hComPort, szText,
lstrlen (szText)*sizeof (TCHAR),&cBytes, 0);


楼主,你发送时用的szText,是TCHAR类型的,而发送长度又是sizeof (TCHAR)计算出来的,sizeof(TCHAR)是返回字节数的,所以是2,当你输入一个A时,发送的就是41 00啦。
jonsenwu 2010-02-07
  • 打赏
  • 举报
回复
Unicode 码吧?,转换下。
sunrain_hjb 2010-02-06
  • 打赏
  • 举报
回复
串口发送前做一下单双字节的转换,你说的现象估计是发送了UNICODE的Buffer了。
Ton2000 2010-02-06
  • 打赏
  • 举报
回复
发送szAnsi应该是没问题的。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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