首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

关于点阵上座机的,求指点

2013-06-26 
关于点阵上位机的,求指点我用VC写了一个上位机程序,输入的点阵码转化为16进制的数据发送到单片机,由显示字

关于点阵上位机的,求指点
我用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()这个部分是你下位机接收的部分吧?但是接收数据的时候是会产生中断的,也就是说你在接收数据的时候是要在中断中完成。你应该把这些放入中断中进行,或者在中断中放个标志位让它跳到这个函数也行。。。

热点排行