jindizhiwa 发表于 2023-3-9 16:39:01

STC8G1K08的串口

请教下,用STC-ISP6.91里的范例程序生成串口2的代码,波特率115200,在while里发送0x5a,用ISP下载/编程,

串口助手可以收到

但是将目标单片机设为仿真芯片,进入仿真状态,串口助手收不到数据了,也不能进入中断。
用论坛里下载的STC8G-STC8H-LIB-DEMO-CODE-20220509里的07-串口2中断模式与电脑收发测试进行测试,

切换端口为 UART2_SW_P10_P11;分别修改波特率为9600和115200测试,可以进入接收中断,也可以进入发送函数,


但是串口助手收不到数据,并且收到的数据不对,像是波特率不对。

怎么排查?或者哪里的操作不对?


程序里的设置


乘风飞扬 发表于 2023-3-9 17:15:43

库函数版本程序里面IO口初始化程序被你屏蔽了,STC8系列单片机除了P3.0,P3.1外其它IO口默认是高阻输入模式,不进行初始化是无法输出信号的。


串口切换到P1.0,P1.1后,至少需要对P1.1口进行初始化,比如设置为准双向模式。




寄存器版本的程序,从仿真界面看你应该使用了软件模拟仿真,而不是硬件仿真。请确认仿真设置,只有硬件仿真才能输出数据。
https://www.stcaimcu.com/data/attachment/forum/202303/09/161941lr83uookuokpkedk.png

jindizhiwa 发表于 2023-3-9 17:37:12

谢谢。修改程序,初始化p1.0,p1.1

void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                //½á¹¹¶¨Òå

        GPIO_InitStructure.Pin= GPIO_Pin_0 | GPIO_Pin_1;                //Ö¸¶¨Òª³õʼ»¯µÄIO, GPIO_Pin_0 ~ GPIO_Pin_7
        GPIO_InitStructure.Mode = GPIO_OUT_OD;//GPIO_PullUp;        //Ö¸¶¨IOµÄÊäÈë»òÊä³ö·½Ê½,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);        //³õʼ»¯
}
收到的数据不对,像波特率不对

串口助手收到的数据也不是发送的

乘风飞扬 发表于 2023-3-9 18:20:42

jindizhiwa 发表于 2023-3-9 17:37
谢谢。修改程序,初始化p1.0,p1.1

void        GPIO_config(void)




我查了一下你的代码,发现串口2的发送函数被修改了,只要改回原来的 TX2_Buffer = dat; 就正常了。

神农鼎 发表于 2023-3-9 18:24:05



用下面超级完善的测试程序测试

【新提醒】求STC8H/STC8G系列 4个串口同时通信的演示程序,Modbus 演示程序 - 串行口,DMA支持的4组串口 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)

jindizhiwa 发表于 2023-3-10 08:41:41

谢谢。调试的时候发现没发出数据,所以参照寄存器改的。再请教下,S2BUF = dat;在寄存器程序里可以,为嘛在库函数里不行了?

jindizhiwa 发表于 2023-3-10 09:11:38

谢谢,uart2可以收发了。另再请教下,Uart3.hex烧入芯片后没有反应,我用的P1.6和P1.7做串口3,程序里要怎么设置?看程序里用的P0.0 P0.1,或者P5.0 P5.1.

jindizhiwa 发表于 2023-3-10 09:18:33

看了手册,STC8G只有串口1和2,应该用串口1测试

32G12K128 发表于 2023-3-10 15:39:36

官网的串口助手也是非常好用的,可以测试看看





乘风飞扬 发表于 2023-3-10 17:06:03

jindizhiwa 发表于 2023-3-10 08:41
谢谢。调试的时候发现没发出数据,所以参照寄存器改的。再请教下,S2BUF = dat;在寄存器程序里可以,为嘛在 ...

如果直接往S2BUF写入发送数据的话,需要等待发送完成后才能再写入第二个要发送的数据,不然没发完就写入新的数据就会把上一个数据覆盖掉。
库函数使用的是缓冲区队列的方法,将需要发送的数据先装入缓冲区里,然后在发送中断里一个个进行发送。
页: [1]
查看完整版本: STC8G1K08的串口