| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1161 人关注过本帖
标题:hzk16文件无法读取
只看楼主 加入收藏
kaitianjian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-10-16
结帖率:25%
收藏
已结贴  问题点数:20 回复次数:22 
hzk16文件无法读取
最近在用mfc写一个点阵取模程序,但是hzk16文件无法读取,而.txt文件都能读取?

void CMSComDlg::ReadDataFromFile()
{
    CFile file("HZK16", CFile::modeRead|CFile::typeBinary);
    memset(cBuf, 0, 1024);
    file.Read(cBuf, 32);
    file.Close();
    Invalidate();
}
搜索更多相关主题的帖子: void file 
2012-02-27 15:03
mayuebo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:257
专家分:1282
注 册:2005-9-8
收藏
得分:5 
Buffer太小了吧

成功贵在坚持
2012-02-28 08:10
kaitianjian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-10-16
收藏
得分:0 
应该不小,估计是数据格式有问题
从书上了解到,串口控件mscom的setoutput函数发送二进制数据时,要将
字节型数据存入参数变量中。

void CMSComDlg::OnSend()
{
    UpdateData();   //更新数数据参数

   ReadDataFromFile();
   m_strSendData.Format("%s", cBuf);
    _variant_t vSendData;   //定义发送数据变量
    vSendData = m_strSendData;  //转换发送数据类型

     m_ctrMSCom.SetOutput(vSendData);//发送数据
2012-02-28 12:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
你說的無法讀取是什麼情形?

授人以渔,不授人以鱼。
2012-02-28 13:04
kaitianjian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-10-16
收藏
得分:0 
今天又试了一下,改用串口类 CSerialPort.cpp,貌似可以读到数据,但只能读到一个,而且发送时没见反应


void CSerialPortComDlg::ReadDataFromFile()   //读文本数据
{
CFile file("HZK16", CFile::modeRead|CFile::typeBinary);
//    char *p = m_strSendData.GetBuffer(m_strSendData.GetLength());
    memset(cBuf, 0, 1024);
//    file.Seek(100,CFile::begin);  
    file.Read(cBuf, 32);   
    file.Close();
    Invalidate();
}

void CSerialPortComDlg::OnSend()
{
    // TODO: Add your control notification handler code here
    UpdateData();
    ReadDataFromFile();
       int i = 0;
    while(cBuf[i++])
    assert(i=1);     //貌似cBuf里只有一个元素
    m_spSerialPort.WriteToPort(cBuf);
  //  m_spSerialPort.WriteToPort((char *)(LPCTSTR)m_strSendData);
}
 
我把整个程序贴出来,里面有具体的说明
SerialPortCom.part1.rar (1000.07 KB)

SerialPortCom.part2.rar (1000.07 KB)

SerialPortCom.part3.rar (127.58 KB)
2012-02-28 19:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
你的代碼就只讀了hzk16中的32byte數據,即全角空格。是不是想把整個字庫傳送出去呀?不需要的呀,要哪個字就送那個字的32byte字模,不用全部送過去的,除非你這個是初始化階段,不怕耗時。

授人以渔,不授人以鱼。
2012-02-28 19:49
kaitianjian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-10-16
收藏
得分:0 
32B全角空格,我不太明白?
我现在只是在测试,看能否读出32b的数据并发送出去!
2012-02-29 10:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
hzk16是16*16點陣的字模數據庫,每32byte一個字,是按照區位碼順序排列的。第一個32Byte數據是全0的,對應全角漢字空格(區位碼0101,空格是什麼都沒有的,所以對應的點陣全滅,即全部是0,可能這樣你就以為沒讀到數據),0102是頓號……要提取某個漢字的字模,用內碼計算出區位碼,然後定位到文件的正確位置,取出32Byte數據就是了。其實你只是要測試串口通訊的話,不用拿hzk16做數據,隨便寫若干字節就可以了。

授人以渔,不授人以鱼。
2012-02-29 12:40
kaitianjian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-10-16
收藏
得分:0 
恩,我再看看,如果不行,就用fread()试试!
2012-03-01 13:30
kaitianjian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-10-16
收藏
得分:0 
改用了fread和fseek函数,直接将c语言读取自摸程序中的一段代码靠过来,却出现有得字能读完整出,如我、他,有得字只能读取一点或读不到,如“你”只能读到一个“▲“字符,纳闷啊?

void CSerialPortComDlg::ReadDataFromFile()
{   
     unsigned  char i=0xa1,j=0xa1;
     unsigned   char   qh,wh;
     unsigned  long offset;
     char *p = m_strSendData.GetBuffer(m_strSendData.GetLength());//获得汉字区位码所在指针
     unsigned   char q = p[0], w = p[1];
     qh=q-0xa0;
     wh=w-0xa0;
     offset=((qh-1)*94+(wh-1))*32L;  //计算在自摸中偏移量
     FILE *fd;
     fd=fopen( "HZK16 ", "rb ");
     fseek(fd,offset,SEEK_SET);
     memset(cBuf, 0, 1024);
     fread(cBuf,32,1,fd);   
     fclose(fd);

SerialPortCom.part1.rar (1000.11 KB)

SerialPortCom.part2.rar (1000.11 KB)

SerialPortCom.part3.rar (148.38 KB)
2012-03-03 10:54
快速回复:hzk16文件无法读取
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053143 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved