读书人

关于点阵上座机的求指点

发布时间: 2013-06-26 14:29:32 作者: rapoo

关于点阵上位机的,求指点
我用VC写了一个上位机程序,输入的点阵码转化为16进制的数据发送到单片机,由显示字体的数组接收,我采用串口中断,接受字符程序如下,本意是希望从上位机发送16*16点阵数据,进而显示,这样就可以灵活控制单片机的显示。
void rece()
{
uchar i;

i=0;
do
{
while(RI==0) ;
tab[i]=SBUF;
RI=0;
i++ ;
}while(tab[i-1]!=0xff);//ff作为借宿的标记

}
上位机中发送数据
void CKpdianzhenDlg::OnOK()
{
// TODO: Add extra validation here
CByteArray hexdata;
UpdateData(true);
int len=str2HEX(m_send,hexdata);
UpdateData(false);
m_ctrlComm.SetOutput(COleVariant(hexdata));
}其中str2HEX是将字符串转为16进制,
char CKpdianzhenDlg::HexChar(char c)
{
if(c>='0' && c<='9')
return c-0x30;
else if(c>='A' && c<='F')
return c-'A'+10;
else if(c>='a' && c<='f')
return c-'a'+10;
else
return -1;
}
int CKpdianzhenDlg::str2HEX(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=HexChar(hstr);
lowhexdata=HexChar(lstr);
if((hexdata==16) || (lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
return hexdatalen;
}
这是将字符串转化16进制的发送。
按如上程序我发现偶尔能置换tab[]数组,但是是一对乱,根本不是对应的字;
请问我这样的思路有错吗?问题出在哪里了,有经验的能给点意见吗,或者有这方面的代码能给参考下吗
[解决办法]
因为点阵字库的矩阵大小是固定的,因此不需要什么结束标志。

因此,也就不需要做什么数据格式转换,将点阵的 Char 数据字节发下来就可以了。

[解决办法]

引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

以前弄过,上位机发送24*24的点阵,,字库在上位机,缺点是要发送字节多,下位机要有很大的RAM,

能给个点代码参考下吗,我发现我只要数据发多了后面接受的就出现错误了,现在整不出头绪,不知道从哪做起

是不是因为你存不下数据了所以后面就出错,最近在弄51的16*16点阵,放到flash区比较好吧?还在实验中,不一定可行嘿嘿

不是呀,好像是单片机的程序写错了,接受到的数据有误呀,我是从SBUF接受一个字节的内容,串口通讯就看了这个,要不要弄什么通讯协议啊..能交流下不,没方向...


不知道为啥,居然你回复了我这里木有提示,刚刚看了下你的程序,void rece()这个部分是你下位机接收的部分吧?但是接收数据的时候是会产生中断的,也就是说你在接收数据的时候是要在中断中完成。你应该把这些放入中断中进行,或者在中断中放个标志位让它跳到这个函数也行。。。

读书人网 >单片机

热点推荐