5261|8

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教:改变串口发送数据的格式(长度) [复制链接]

大家好,小弟现在调试的串口程序进行简单的收发数据没有什么问题,比如我发送“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;
}

最新回复

问题已解决,就是转换ASCII码的问题,谢谢大家啦,结贴发分喽  详情 回复 发表于 2010-2-21 20:53
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
学习,学习,呵呵。
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
Unicode 码吧?,转换下。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
// 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啦。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 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啦。


的确如您所说的那样,小弟是个菜鸟,不怕大家笑话,我试着修改了szText的数据类型,现在的问题是这样的话数据类型与接下来的函数GetWindowText ();  StringCchCat (); wcstombs_s (); 中的参数需要的数据类型就不符了,可以更改函数中参数的默认类型么?望大家指点,谢谢啦
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

6
 
因为wince上层一般都是用unicode字符,楼主的意思是想将unicode改为Ascii码,再用串口发送?
如果楼主仅仅只有字符和数字等字符串的话。那就比较简单了。因为对于字符和数字来说,仅仅是将1byte变成2byte宽度,前面补零。
即:'A'的ASCII为0x41, 它的UNicode为0x0041
这样吧前面的00去掉,就可以转成ASCII码了。
char Ascbuf[[100];
for(i=0;i {
    Ascbuf = (char)szText;
}
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
发送szAnsi应该是没问题的。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
串口发送前做一下单双字节的转换,你说的现象估计是发送了UNICODE的Buffer了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
问题已解决,就是转换ASCII码的问题,谢谢大家啦,结贴发分喽
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表