解决方法:STM32使用cJSON解析数据失败

解决方法:STM32使用cJSON解析数据失败,第1张

在 STM32 移植 cJSON 库后,使用 cJSON_Parse() ,解析失败

使用 cJSON_GetErrorPtr() 分析出以下错误:

而当去掉 serial_no 字段后,则能够解析成功。

当解析的的数据比较长时,会解析失败,但是短的数据则没有问题,后面排查是因为 cJSON 解析需要用到的内存比较大,溢出导致解析失败。

查看 STM32 启动文件。如 startup_stm32f407xx.s ,发现:

增大空间后,问题解决

• 由 Leung 写于 2022 年 6 月 30 日

• 参考: STM32工程使用cjson库解析数据失败的原因

在工程文件夹新建一个.vscode的文件夹,然后新建一个c_cpp_properties.json的文件,在文件中添加configurations即可。name与includePath根据自己的工程配置填写即可(这里includePath填写后,vscode就可以在函数、变量之间任意跳转了,如果不填写,可能有些函数、变量是无法跳转的)。在defines中写入"__CC_ARM"即可。

lua文件上传直连:

nginx配置

注意:

文件存储路径

指定上传逻辑代码路径

在nginx上添加一个server

#上传文件服务

server

{

listen 19999

set $store_dir "/data/vue/fffoa/"# 文件存储路径

location /upfile {

content_by_lua_file conf/lua/upload.lua# 实现文件上传的逻辑

}

location /download {

autoindex on

autoindex_localtime on

alias /data/vue/fffoa/

index index.html

}

access_log logs/uploadfile_access.log main

error_log logs/uploadfile_error.log crit

}

登录后复制

实现上传逻辑代码 conf/lua/upload.lua

注意:我使用的是openresty,可以直接引用resty.upload等lua库,如果你是nginx,还需要找到upload.lua、cjson库

-- upload.lua

--==========================================

-- 文件上传

--==========================================

local upload = require "resty.upload"

local cjson = require "cjson"

local chunk_size = 4096

local form, err = upload:new(chunk_size)

if not form then

ngx.log(ngx.ERR, "failed to new upload: ", err)

ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)

end

form:set_timeout(1000)

-- 字符串 split 分割

string.split = function(s, p)

local rt= {}

string.gsub(s, '[^'..p..']+', function(w) table.insert(rt, w) end )

return rt

end

-- 支持字符串前后 trim

string.trim = function(s)

return (s:gsub("^%s*(.-)%s*$", "%1"))

end

-- 文件保存的根路径

local saveRootPath = ngx.var.store_dir

-- 保存的文件对象

local fileToSave

--文件是否成功保存

local ret_save = false

while true do

local typ, res, err = form:read()

if not typ then

ngx.say("failed to read: ", err)

return

end

if typ == "header" then

-- 开始读取 http header

-- 解析出本次上传的文件名

local key = res[1]

local value = res[2]

if key == "Content-Disposition" then

-- 解析出本次上传的文件名

-- form-dataname="testFileName"filename="testfile.txt"

local kvlist = string.split(value, '')

for _, kv in ipairs(kvlist) do

local seg = string.trim(kv)

if seg:find("filename") then

local kvfile = string.split(seg, "=")

local filename = string.sub(kvfile[2], 2, -2)

if filename then

fileToSave = io.open(saveRootPath .. filename, "w+")

if not fileToSave then

ngx.say("failed to open file ", filename)

return

end

break

end

end

end

end

elseif typ == "body" then

-- 开始读取 http body

if fileToSave then

fileToSave:write(res)

end

elseif typ == "part_end" then

-- 文件写结束,关闭文件

if fileToSave then

fileToSave:close()

fileToSave = nil

end

ret_save = true

elseif typ == "eof" then

-- 文件读取结束

break

else

ngx.log(ngx.INFO, "do other things")

end

end

if ret_save then

ngx.say("save file ok")

end

登录后复制

测试上传文件

在postman里面写上 地址:19999/upload/

配置好文件,选发送,上传成功显示 save file ok

查看服务器内容

CSDN_码404:使用openresty的lua-resty-upload实现文件上传

nginx

lua

点赞文章给优秀博主打call~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11943116.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存