本人现在有一个“英创EM9260”套件,想在上面做一个简单的串口程序,实现给一个电度表发送字符串并接收其返回的字符串,然后通过一个lcd屏幕显示返回的字符串。我把套件提供的一个串口通信的示例程序做了简单的修改,但是只能实现发送数据,回收的数据怎么弄也无法显示到lcd上。以下是这个程序的接收函数,想问下大家这个代码有什么问题,为什么可以把串口发送过来的字符原样的反法出去却无法在lcd上显示呢?本人第一次接触wince方面的东西,真是弄不明白啊,希望大家帮忙看看!
void CALLBACK OnReceive( )
{
int i;
int cg;
char str[100];
char str1[100];
char p[14];
DWORD dwlen;
dwlen = ceSer.WritePort( ceSer.DatBuf, ceSer.m_lDatLen );
SendLen += dwlen;
if( type>0 )
{ if(ReceiveLen==18){
for(i=0;i<18;i++)
str1=ceSer.DatBuf;
}
sprintf( str, "接收数据: %ld ",str1);
LCD_WriteString( 8, 16, str, 1 );
}
}
串口一般操作的是ANSI,而CE显示的API函数只支持Unicode。所以接收到后,需要转换才能正确显示。
一楼的朋友你好,我现在的情况是,不论给串口发送什么字符串,比如“68 09 00 00 10 07 00 68 81 06 43 C3 83 3C 33 33 A2 16”我屏幕上显示的都是 94684 这几个数,请问这是因为Undicode的问题码?还是我的代码哪里不对?我在pc端上用串口调试助手可以看到程序返回的字符串和我发送的一样,就是没办法在lcd上显示啊。谢谢!
同意 91program 的意见。
首先,要搞清楚一点,那个电表返回什么东西,实际上就是电表返回什么编码的字符串?
这样先看看那个电表的说明书,看说明书上是怎么写的?
///////////////
这里我先做个猜测:
我看电表返回的字符串(也许不返回字符串,而是二进制数据),
如果返回的是字符串,那么它很有可能使用 ANSI 编码(以前的设备基本都是ANSI编码)
这样,即使你正确接收到字符串,也无法正确显示在 Wince 设备上。
原因是,Wince 使用 UNICODE 编码,所以肯定要出问题。
解决的方法就是把接收到的字符串进行转换,转换成 UNICODE 编码,就可以正确显示。
一是使用 API 函数 MultiBytesToWideByte
二是使用简单的方法,如下:
char buf[100];
// 从串行口接收数据放到 buf 中
CString str(buf); // CString 帮你转换了,就是这么简单
MessageBox(str);
不过,第一步是你需要知道电表到底返回什么东西!!!
zaobt 你好,我在pc用“串口调试助手”直接发送“68 09 00 00 10 07 00 68 01 02 43 C3 F9 16”到电度表,它给我返回的是“68 09 00 00 10 07 00 68 81 06 43 C3 83 3C 33 33 A2 16” ,然后根据“83 3C 33 33 ”这几位可以求出电表当前的读数。请问这个应该是编码的问题而无法显示码?
应该是你接收出了问题吧!你查一下是不是没有全部接收?
概念有问题
LCD_WriteString()打印的是ASCII/Unicode字符。
你想看你接受的hex码,应该把这些hex转成字符先
是不是回发的数据采用了什么协议,每次显示都是其中非数据的一部分。
这种通讯问题,直接找板商,他们有提供的解决方案。
估计你自己写的话,一方面不稳定,二时间上跟不上进度。
最近做了几个相关的串口通讯和GPIO控制的小项目。
发现不少工厂、工业控制领域对ARM/WINCE了解不够,导致一个简单的通讯问题花费不少时间。
void CALLBACK OnReceive( )
{
int i;
int cg;
char str[100];
char str1[100];
char p[14];
DWORD dwlen;
dwlen = ceSer.WritePort( ceSer.DatBuf, ceSer.m_lDatLen ); 这个是在发送数据吗?
SendLen += dwlen;
/*接收代码全贴出来了吗??*/
if( type>0 )
{ if(ReceiveLen==18){
for(i=0;i <18;i++)
str1=ceSer.DatBuf; 接收数据数组ceSer.DatBuf与上面发送数据数组是一个吗?
}
sprintf( str, "接收数据: %ld ",str1); str1应该转化成16进制的字符串吧,这个函数你确定能实现吗?
LCD_WriteString( 8, 16, str, 1 ); //LCD_WriteString函数的第三个参数类型是否是char*还是CString,还是说随便输入什么自动显示16进制 ??
}
}