论坛元老
- 积分
- 8184
- 金钱
- 8184
- 注册时间
- 2020-5-11
- 在线时间
- 3697 小时
|
参照正点原子的USMART,我写了个用于51单片机的类似程序,附件中的usmart51.c。
没能直接移植,因为水平有限,看到函数指针头大,在传递参数时始终编译出错。
说下我的方案:
串口接收中断调用usmart_rx(),收到\r字符认为是一帧数据,然后调用
usmart_proc()处理串口数据,解析函数名称、转换参数、调用函数、显示返回值。
注意:此程序仅供娱乐,因为有BUG。
所用单片机为STC15W408AS,默认参数;
编译器:KEIL2
如串口收到字符串
funtest1(-1,'1')
程序将调用funtest1函数并传递参数、显示返回值,
参数支持10进制、2进制和16进制。
usmart_setbase用于设置usmart_sendnum所用的进制。
注意事项:
*文件需包含MSTRING.C,用于字符串的处理
*指令以回车换行结尾;
*如果串口未使用队列,串口助手向单片机
发送数据只能一次一行发送(回车换行结尾),否则后面的指令
会覆盖先前的,引起错误。
*若占用内存较多,在Target/options for Target/Target/Memory Model里要选择Large
串口助手发字符串示例:
funtest1(-1,'1')
funtest1(0b11,0x01)
funtest2("hello\r\nabc","def")
usmart_setbase(2)
usmart_setbase(16)
funtest1(65535,0)
usmart_setbase(10)
串口助手收到:
函数:funtest1()=48
函数:funtest1()=4
函数:funtest2()hello
abcdef=1234
函数:usmart_setbase()=0b10
函数:usmart_setbase()=0x10
函数:funtest1()=0xFFFF
函数:usmart_setbase()=10
移植注意修改:
usmart_sendbyte、usmart_sendstr、
串口接收中断调用usmart_rx()、
主循环里加上这一段:
if(usmartflag&BIT(0))//收到一帧数据
{
IOCLR(usmartflag,BIT(0));//清标志
usmart_proc();//处理数据
}
usmart_proc里的匹配目标函数部分根据需要修改:
if(mStrEqu(Token_Buf,"funtest1"))
{
r=funtest1(m_GetPar(),m_GetPar());//每个参数一个m_GetPar()
}
USMART51.rar
(161.19 KB, 下载次数: 26)
|
|