使用从Matlab到嵌入式设备的fread读取所有字符

时间:2014-06-18 15:13:25

标签: c matlab embedded hex eof

我正在尝试通过Ulab从Matlab将包含HEX字符的文件中的数据复制到我的嵌入式设备的SRAM内存中。问题是我不知道如何使程序停止将任何收到的字符视为特殊命令。

例如:符号''根据ASCII表具有等效于0x20的HEX。但是,我的数据可能会在某处出现这个0x20。所以,我不能用它作为我程序的分隔符。

请建议我一种方法,可以在不引起任何此类问题的情况下读取hex文件中的所有数据。

这是我的代码的一部分。

memcpy(((uint8_t*)(SRAM_BASE+i)),&cThisChar,1);
    UARTCharPut(UART0_BASE, cThisChar);
        i++;

    //
    // Stay in the loop until either a CR or LF is received.
    //
    } 
         while((cThisChar != '\n') && (cThisChar != '\r')); // this is where the problem happens!

那么我应该为while循环设置一个条件,以便接受所有字符?

谢谢!

3 个答案:

答案 0 :(得分:0)

不要试图通过其内容获取文件结尾。 获取它的大小并使用计数器。

FILE *fp = NULL;
long int fsize = 0;
long int fptr = 0;

/* Open file. */
/* todo: Open file here. */

/* Get file size. */
fseek(fp, 0L, SEEK_END);
fsize = ftell(fp);
fseek(fp, 0L, SEEK_SET);

/* Process file data. */
while (fptr < fsize) {
    /* todo: Do your stuff here. */
    ++fptr;
}

/* Close file. */
/* todo: Close file here. */

答案 1 :(得分:0)

基本上,这就是我想要实现的目标!不管怎样,谢谢你的努力!

signed char cThisChar;
    while (cThisChar != EOF);

答案 2 :(得分:0)

我发布了解决方案。

while (j < 2048)
{
   do
   {
      //
      // Read a character using the blocking read function.  This function
      // will not return until a character is available.
      //
      cThisChar = UARTCharGet(UART0_BASE);

      //
      // Write the same character using the blocking write function.  This
      // function will not return until there was space in the FIFO and
      // the character is written.
      //
      memcpy(((uint8_t*)(SRAM_BASE+i)),&cThisChar,1);
      UARTCharPut(UART0_BASE, cThisChar);
      i++;

      //
      // Stay in the loop until either a CR or LF is received.
      //
   } //while((cThisChar != '\n') && (cThisChar != '\r'));
   while (i<17);
   j++;
}

这是微控制器方面代码的一部分。经过反复迭代,我发现使用16的缓冲区值是最好的选择。 j是外循环计数器= 32768/16 = 2048.通过这个我可以写入16字节包中的所有32768字节。

现在相应的MATLAB版代码:

while(true)

    txdata = fread(A,**16**,'uint8','ieee-be');
    %[my_count_rows, my_count_columns]=size(txdata);
    %Convert to decimal format
    %txdata_dec = hex2dec(txdata);
    %Write using the UINT8 data format

    **fwrite(obj1,txdata(1:16),'uint8');**
    if txdata > 32768
        break;
    end    
end