MFC中用serialport类写的串口通信,想读取txt文件里面内容并逐行发送,求解决方法额

帅哥腿毛长 2017-03-05 08:31:56
如题,串口已经写好,界面如图,选择指令即为打开txt文件并能显示出来,此部分功能都已实现。

菜鸟一只,求大家指导一下。
...全文
1598 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
欠打的逃亡者 2018-05-08
  • 打赏
  • 举报
回复
引用 14 楼 a393062456 的回复:

   string buff;
   int n=0;
    ifstream infile;  
   infile.open("你要打开的文件名.txt"); 
    if(!infile)  
        return;
   while(getline(infile, buff)) 
{
      a[n++]=buff;  
}
怎么把读到的文档直接放到编辑框里
worldy 2018-04-20
  • 打赏
  • 举报
回复
如果文件不是太大,比如几K,则在串口开辟合适大小的发送发出去·缓冲区,整个发送 否则,则逐个寻找回车换行符,逐行发送
赵4老师 2018-04-19
  • 打赏
  • 举报
回复
仅供参考:
//NAME: essaie bla bla
//DIMENSION: 8
//DATA
//1  14  15
//2  11  10
//3  6   4
//4  7   13
//5  9   21
//6  19  3
//7  1   5
//8  8   8
//EOF
//
// 文本文件中可能还含有其他内容,但是需要用到的内容即以上

//比如data.txt:
//NAME: essaie bla bla
//其它内容
//DIMENSION: 8
//其它内容
//DATA
//其它内容
//1  14  15
//其它内容
//2  11  10
//其它内容
//3  6   4
//其它内容
//4  7   13
//其它内容
//5  9   21
//其它内容
//6  19  3
//其它内容
//7  1   5
//其它内容
//8  8   8
//其它内容
//EOF

// 目标是要获取NAME后字串,DIMENSION后数值,以及DATA以下的数值
// 其中NAME就是随便个字句,DIMENSION是城市数量,DATA以下是城市编号,X坐标,Y坐标
// 所有的这些将赋值给一个事先定义好的结构
#include <stdio.h>
#include <string.h>
#define MAXCPL   80   //每行最大字符数
#define MAXCITY  100  //每组数据中DATA最多项数,DIMENSION的最大值
#define MAXNAMEL 32   //NAME最大长度
struct S {
    char NAME[MAXNAMEL+1];
    int  DIMENSION;
    struct D {
        int NO;
        int X;
        int Y;
    } DATA[MAXCITY];
} s;
FILE *f;
int st,n,i;
char ln[MAXCPL];
int main() {
    f=fopen("data.txt","r");
    if (NULL==f) {
        printf("Can not open file data.txt!\n");
        return 1;
    }
    st=0;
    n=0;
    while (1) {
        if (NULL==fgets(ln,MAXCPL,f)) break;
        if (st==0) {
            if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;
        } else if (st==1) {
            if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;
        } else if (st==2) {
            if (0==strcmp(ln,"DATA\n")) st=3;
        } else if (st==3) {
            if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {
                n++;
                if (n>=MAXCITY || n>=s.DIMENSION) break;
            }
        }
    }
    fclose(f);
    printf("s.NAME=[%s]\n",s.NAME);
    printf("s.DIMENSION=%d\n",s.DIMENSION);
    for (i=0;i<n;i++) {
        printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);
    }
    return 0;
}
//s.NAME=[essaie bla bla]
//s.DIMENSION=8
//s.DATA[0].NO,X,Y=1,14,15
//s.DATA[1].NO,X,Y=2,11,10
//s.DATA[2].NO,X,Y=3,6,4
//s.DATA[3].NO,X,Y=4,7,13
//s.DATA[4].NO,X,Y=5,9,21
//s.DATA[5].NO,X,Y=6,19,3
//s.DATA[6].NO,X,Y=7,1,5
//s.DATA[7].NO,X,Y=8,8,8

欠打的逃亡者 2018-04-19
  • 打赏
  • 举报
回复
大哥我是一个c++菜鸟学生,老师让写一个传输,能不能留一个联系,程序借我看看,谢谢你了
Pingo520 2017-03-08
  • 打赏
  • 举报
回复
使用上面这个代码你要确保你的数组有足够的存储空间,不然最好用vector
Pingo520 2017-03-08
  • 打赏
  • 举报
回复

   string buff;
   int n=0;
    ifstream infile;  
   infile.open("你要打开的文件名.txt"); 
    if(!infile)  
        return;
   while(getline(infile, buff)) 
{
      a[n++]=buff;  
}
帅哥腿毛长 2017-03-08
  • 打赏
  • 举报
回复 1
引用 12 楼 a393062456 的回复:
读txt文件的时候,用getline循环读取。你这个用vector更好,因为你不知道文件里面到底有多少行,用vector<string>存。 每读取到一行就添加到vector里面去。直到读取结束。发的时候循环遍历vector发就好了。vector本质是个动态数组
你好,十分感谢你的回答。不过我现在还是有点不是很清楚数组的使用。 dlg.h中: cstring a1[],a2[],a3[]; dlg.cpp中: getline(myfile,strm,'\n') a1[]=strem; 我现在只能想到这么多,不知道怎么才可以把每行读到对应的数组中。新手实在想不明白,希望老兄能不吝赐教,十分感谢!
Pingo520 2017-03-08
  • 打赏
  • 举报
回复
读txt文件的时候,用getline循环读取。你这个用vector更好,因为你不知道文件里面到底有多少行,用vector<string>存。 每读取到一行就添加到vector里面去。直到读取结束。发的时候循环遍历vector发就好了。vector本质是个动态数组
帅哥腿毛长 2017-03-08
  • 打赏
  • 举报
回复
引用 10 楼 a393062456 的回复:
数组?string数组?你是指读取的一行保存到一个string数组元素里面吗。这样也可以啊,做个循环,对数组里面的元素循环发送就可以了啊
对对对,就是这个意思,我弄了半天还是不会,不知道把数据一行一行的写到数组应该怎么写。 比如txt文件中:234 4ge hhf 可否详细一点,实在是不会写了。十分感谢。
Pingo520 2017-03-08
  • 打赏
  • 举报
回复
数组?string数组?你是指读取的一行保存到一个string数组元素里面吗。这样也可以啊,做个循环,对数组里面的元素循环发送就可以了啊
vcf_reader 2017-03-08
  • 打赏
  • 举报
回复
读发读发读发……
帅哥腿毛长 2017-03-07
  • 打赏
  • 举报
回复
引用 7 楼 a393062456 的回复:
发送框用listctr控件,每读取一行txt就存到控件的对应行,发送的时候从控件的第一行开始发送,这样可以?
要求不能用list,只能用数组。我刚入手菜鸟,不是很会用数组。就是从txt读一行然后定时器发一行。我现在所有功能都实现了,就差这个。大神可否赐教一下,详细点额最好,十分感谢
Pingo520 2017-03-06
  • 打赏
  • 举报
回复
发送框用listctr控件,每读取一行txt就存到控件的对应行,发送的时候从控件的第一行开始发送,这样可以?
帅哥腿毛长 2017-03-06
  • 打赏
  • 举报
回复
引用 1 楼 Janxionwang 的回复:
你是说你想要知道如何把你从ini文件里读出来的CString循环写到串口?你都读出来可以显示到Edit里了,又说封好串口了,那不就是CString转换一下变量类型?你问的是什么意思?



如图,我的串口已经写好,接收都可以,我就是想点选择指令(指令存在txt文件中,一行一行的)按钮后,显示在发送框里(也是一行一行的),然后点开始发送后也一行一行的发出去,后期我想加上定时器。
摩登码农 2017-03-06
  • 打赏
  • 举报
回复
你如果要做循环,可以再你的配置文件内加这样: [COMMAND_TEST] CMD_TOTAL = n CMD1 = ... CMD2 = ... CMD3 = ... ... CMDn = ... 然后把n也读出来 #define CMDSIZE 512 CString strConfig; CString strFileName; int nLen = GetPrivateProfileString("COMMAND_TEST", "CMD_TOTAL", NULL, strConfig.GetBuffer(CMDSIZE), CMDSIZE, strFileName); strConfig.ReleaseBuffer(); if (nLen < 0) { LogInfo("Read Command_TEST.ini:TOTAL Failed,Please Check Config File!", RED); return; } int nTotalNumber = atoi(strConfig);//----------------------------------------------------------Command Amount for(int nIndex = 0; nIndex<nTotalNumber ;nIndex ++) { 逐个写到串口; }
  • 打赏
  • 举报
回复
安行读取txt文件内容,转换成Hex格式,扔进串口,完事 CStdioFile类进行文本安行读
sevancheng 2017-03-06
  • 打赏
  • 举报
回复
在网上找一个串口类使用就可以了
摩登码农 2017-03-06
  • 打赏
  • 举报
回复
引用 6 楼 shuaigetuimaochang 的回复:
[quote=引用 1 楼 Janxionwang 的回复:] 你是说你想要知道如何把你从ini文件里读出来的CString循环写到串口?你都读出来可以显示到Edit里了,又说封好串口了,那不就是CString转换一下变量类型?你问的是什么意思?
如图,我的串口已经写好,接收都可以,我就是想点选择指令(指令存在txt文件中,一行一行的)按钮后,显示在发送框里(也是一行一行的),然后点开始发送后也一行一行的发出去,后期我想加上定时器。 [/quote]
引用 6 楼 shuaigetuimaochang 的回复:
[quote=引用 1 楼 Janxionwang 的回复:] 你是说你想要知道如何把你从ini文件里读出来的CString循环写到串口?你都读出来可以显示到Edit里了,又说封好串口了,那不就是CString转换一下变量类型?你问的是什么意思?
如图,我的串口已经写好,接收都可以,我就是想点选择指令(指令存在txt文件中,一行一行的)按钮后,显示在发送框里(也是一行一行的),然后点开始发送后也一行一行的发出去,后期我想加上定时器。 [/quote] 可以按照7楼的建议把显示的控件改为ListControl; 你也可以继续用Edit,按照我在4楼给你回复的方法写配置文件,思路就是两次循环: 1.点击选择文件:从配置文件循环读取字符串并显示到Edit窗口,注意在读出的字符串末尾加\r\n实现换行; 2.点击发送:从配置文件循环读取字符串并发送到串口;
摩登码农 2017-03-05
  • 打赏
  • 举报
回复
你是说你想要知道如何把你从ini文件里读出来的CString循环写到串口?你都读出来可以显示到Edit里了,又说封好串口了,那不就是CString转换一下变量类型?你问的是什么意思?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧