关于 32G12K128 取余计算 不运行的问题
基于官方资料 STC_USB_LIBRARY_DEMO\STC_CDC_INTERRUPT_LIBRARY\stc32g_cdc_interrupt_demo进行usb功能测试。一下是自己写了一个 usb接收到长度进行长度数值打印。num预计取值范围1-25.
完整代码放在二楼,望大神解答一下为啥我的取余会直接卡死。
错误情况查看代码后的注释。
void aixx(u8 num)
{
if(num >= 10)
{
outnum12 = (num/100)+0x30;
outnum12 = num;
USB_SendData(outnum12,2);
//以上是可以执行的
//一下是错误的
//P2=(num-( (num/100)*100)) /10; // 错误不会继续执行 我试了一下 去掉/10可以运行
// P2=num%100; //错误不会继续执行了
//以下修改可运行
// num = 15;
// P2=num%100; //这样可以继续执行了
// num = 15;
//P2=(num-( (num/100)*100)) /10; //这样可以继续执行了
outnum12 =0x31;
//outnum12 =(num%10)+0x30;
}
else
{
outnum12 =0x30;
outnum12 = 0x30;
outnum12 = num + 0x30;
}
} 本帖最后由 琪琪鸭 于 2024-10-22 20:23 编辑
#include "stc32g.h"
#include "stc32_stc8_usb.h"
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
u8 outnum12;
void main()
{
P_SW2 |= 0x80;
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0x00;
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
EA = 1;
while (DeviceState != DEVSTATE_CONFIGURED); //等待USB完成配置
while (1);
}
void aixx(u8 num)
{
if(num >= 10)
{
outnum12 = (num/100)+0x30;
outnum12 = num;
USB_SendData(outnum12,2);
//以上是可以执行的
//一下是错误的
//P2=(num-( (num/100)*100)) /10; // 错误不会继续执行 我试了一下 去掉/10可以运行
// P2=num%100; //错误不会继续执行了
//以下修改可运行
// num = 15;
// P2=num%100; //这样可以继续执行了
// num = 15;
//P2=(num-( (num/100)*100)) /10; //这样可以继续执行了
outnum12 =0x31;
//outnum12 =(num%10)+0x30;
}
else
{
outnum12 =0x30;
outnum12 = 0x30;
outnum12 = num + 0x30;
}
}
/************************************************
函数功能:USB-CDC串口接收数据的回调函数
函数描述:回调函数由USB中断在接收到串口数据时自动调用
回调函数处理完成串口数据后需要返回1
函数返回:返回1:USB中断服务程序自动完成后续的收尾工作
返回0:USB会暂停接收串口数据,直到用户自行调用
usb_OUT_done()函数后USB才会重新恢复接收数据
注意事项:当函数返回1时用户无需调用usb_OUT_done()
只有返回0时才需要调用usb_OUT_done()进行手动收尾
强烈建议usb_OUT_callback返回1
************************************************/
BOOL usb_OUT_callback()
{
aixx(OutNumber);
USB_SendData(outnum12,3); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
return 1;
}
但是 outnum12 = (num %10) + 0x30;可以正确执行。此时num值=12
发送→ 123456781112
接收←012 123456781112
芯片型号 屠龙刀三。2测试板
正在检测目标单片机 ...
单片机型号: STC32G12K128
当前芯片的硬件选项为:
. 系统ISP工作频率: 24.000MHz
. 内部IRC振荡器的频率: 24.000MHz
. 掉电唤醒定时器的频率: 32.575KHz
. 振荡器放大增益使能
. 用户EEPROM大小被设置为 5 K
. P3.2和P3.3与下次下载无关
. 上电复位时增加额外的复位延时
. 复位引脚仍为复位脚
. 检测到低压时不复位,可产生低压中断
. 低压检测门槛电压 : 2.00 V
. 上电复位时,硬件不启动内部看门狗
. 上电自动启动内部看门狗时的预分频数为 : 256
. 空闲状态时看门狗定时器停止计数
. 下次下载用户程序时,不擦除用户EEPROM区
. 下次下载用户程序时,没有相关的端口控制485
. 下次下载时不需要校验下载口令
. 内部参考电压: 1188 mV (参考范围: 1100~1300mV)
单片机型号: STC32G12K128
正在擦除目标区域 ... 完成 !
正在下载用户代码 ... 完成 !
正在设置硬件选项 ... 完成 !
更新后的硬件选项为:
. 系统ISP工作频率: 24.000MHz
. 内部IRC振荡器的频率: 24.000MHz
. 掉电唤醒定时器的频率: 32.575KHz
. 振荡器放大增益使能
. 用户EEPROM大小被设置为 5 K
. P3.2和P3.3与下次下载无关
. 上电复位时增加额外的复位延时
. 复位引脚仍为复位脚
. 检测到低压时不复位,可产生低压中断
. 低压检测门槛电压 : 2.00 V
. 上电复位时,硬件不启动内部看门狗
. 上电自动启动内部看门狗时的预分频数为 : 256
. 空闲状态时看门狗定时器停止计数
. 下次下载用户程序时,不擦除用户EEPROM区
. 下次下载用户程序时,没有相关的端口控制485
. 下次下载时不需要校验下载口令
. 内部参考电压: 1188 mV (参考范围: 1100~1300mV)
芯片出厂序列号 : F7E3C92200A702
单片机型号: STC32G12K128
你试下
邮箱 发表于 2024-10-23 00:40
你试下
谢谢大神你的程序怎么改都是好用的。。。但是没找到啥不一样的地方,我把我的mian.c复制进去都是好用的。希望大神指点一二,难道是我的keill缺东西吗?谢谢
邮箱 发表于 2024-10-23 00:40
你试下
刚开始是开心的找问题 ,直到20分钟没看出来问题, 现在已经哭一个小时了{:5_270:} 琪琪鸭 发表于 2024-10-24 21:18
刚开始是开心的找问题 ,直到20分钟没看出来问题, 现在已经哭一个小时了 ...
不使用 REMOVEUNUSED
邮箱 发表于 2024-10-25 00:29
不使用 REMOVEUNUSED
看到了看到了谢谢大神。 我说怎么你工程多了41个警告。 但是还是不明白为啥这个设置导致的取余错误。。。 本帖最后由 邮箱 于 2024-10-25 20:33 编辑
琪琪鸭 发表于 2024-10-25 19:39
看到了看到了谢谢大神。 我说怎么你工程多了41个警告。 但是还是不明白为啥这个设置导致的取余错误 ...
https://www.stcaimcu.com/forum.p ... REMOVEUNUSED&page=1
别人都只能这样解决
邮箱 发表于 2024-10-25 20:31
https://www.stcaimcu.com/forum.p ... REMOVEUNUSED&page=1
别人都只能这样解决
谢谢大神这个问题还真不是个例{:5_281:}研究了半晚上还是去掉优化来的简单
页:
[1]
2