我在stm32f103中成功构建了lua,下面的代码还可以:
const char lua_test[] = "print("Hello Lua!!")";
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
luaopen_base(L);
luaL_dostring(L, lua_test);
lua_close(L);
字符串正确显示在串行端口中。但是,当我将打印功能放入外部SD卡中时,然后尝试将" Dostring"替换为" Dofile":
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
luaopen_base(L);
if (luaL_dofile(L, "1:/2.txt")!=0) //Run 2.txt in SD card
USART1_Send_String(lua_tostring(L,-1));
lua_close(L);
串行端口显示错误消息" 1:/2.txt:1:意外符号",函数" lual_dofile"返回3。错误消息不包含任何提示,例如"近xxx"。
我已经覆盖了" _sys_open"one_answers" _sys_read",并且确定文件" 1:/2.txt"的读数正确。我试图将2.txt的内容更改为包括新行和空间在内的任何内容,但仍然有同样的错误。
如何解决此问题或如何获得更多错误消息?请帮助我,任何建议都是感谢的。
ps:我正在使用官方LUA 5.3.4。它需要至少7.5kb RAM和65K ROM。我在STM32F103ZET的内部64KB RAM中分配4KB堆栈和16K堆。通过" lual_dostring"运行LUA代码可以正常工作,但是在调用" Lual_dofile"时会出错。
我尝试覆盖" fgetc",而不是" _sys_read",并且它有效。但是我认为,读取一个字符的文件可能会导致IO的不良表现。最后,我发现" _sys_read"的返回值应该是要读取而不是已读取的长度。在校正" _sys_read"函数之后,如下所示," lual_dofile"功能现在正常运行。
int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode)
{
FRESULT fr;
UINT br;
fr = f_read((FIL *)fh, buf, len, &br);
if (fr == FR_OK)
return len - br;
return -1;
}