在线求助!!!stc16c5a60s编写了一个双串口通讯程序,现在是串口后接收有问题,希望哪位大哥能帮忙。

[复制链接]
查看11 | 回复4 | 2021-1-27 05:20:35 | 显示全部楼层 |阅读模式
程序如下:串口1接收发送都可以使用,串口2发送测试也是可以用的,现在问题就是卡在接收上,接收有问题
麻烦论坛大神帮忙看看串口2接收哪里有问题,万分感谢!!!

/***********************************************************************
时间:2020.04.04
芯片:STC12C5A60S2
晶振:11.0592MHz波特率:115200bps
引脚定义:串行口1:发送————TxD/P3.1;接收————RxD/P3.0
串行口2:发送————TxD2/P1.3;接收————RxD2/P1.2
功能描述:STC12双串口通信(中断方式)
当串行口1接收数据后,将此数据由串行口2发送出去
当串行口2接收数据后,将此数据由串行口1发送出去
***********************************************************************/
#include
#include"intrins.h"
#include"string.h"
#include"stdio.h"
#defineS2RI0x01//串口2接收中断请求标志位
#defineS2TI0x02//串口2发送中断请求标志位
#defineucharunsignedchar
#defineuintunsignedint
#defineS2RI0x01
#defineS2TI0x02
#defineCode_head10xAA
#defineCode_head20x55
#definelen25
bitbusy2;//此位用于串口判断是否发送繁忙
charxdataUart2_buff[40];//缓冲数据
charxdataUart1_buff[40];
ucharcount2=0;//串口计数器
ucharcount1=0;//串口计数器
charxdataecho[40];
unsignedcharflag1,flag2,temp1,temp2;
voidClear_Buff();//清除串口1,2中数组的值,为下一次做准备
voidread_code2(uchar_char);//保存串口接收到的字符
voidUart_1_SendString(char*P);//串口1发送字符串函数
floatTDM_Receive_Check();
voidset_brrate();
voidserial_put_uint(unsignedintnumber);
voiddispplay(int_data);
voidread_ac();
voidread_once();
voiddelay_ms(uintms);
/****************串行口初始化函数****************/
voidInitUART(void)
{
PCON&=0x7F;//波特率不倍速
SCON=0x50;//8位数据,可变波特率
AUXR|=0x40;//定时器1时钟为Fosc,即1T
AUXR&=0xFE;//串口1选择定时器1为波特率发生器
TMOD&=0x0F;//清除定时器1模式位
TMOD|=0x20;//设定定时器1为8位自动重装方式
TL1=0xFD;//设定定时初值
TH1=0xFD;//设定定时器重装值
ET1=0;//禁止定时器1中断
TR1=1;//启动定时器1
/****************************115200******************************/
AUXR&=0xF7;//波特率不倍速
S2CON=0x50;//8位数据,可变波特率
AUXR|=0x04;//独立波特率发生器时钟为Fosc,即1T
BRT=0xFD;//设定独立波特率发生器重装值
AUXR|=0x10;//启动独立波特率发生器
IE2=0x01;//允许串口2中断。
EA=1;//总中断一定要开,不然能发送,不能接收
}
/****************串行口1发送****************/
voidUART_1SendOneByte(unsignedcharc)
{
SBUF=c;
while(!TI);//若TI=0,在此等待
TI=0;
}
/****************串行口2发送****************/
voidUART_2SendOneByte(unsignedcharc)
{
S2BUF=c;
while(!(S2CON&S2TI));//若S2TI=0,在此等待
S2CON&=~S2TI;//S2TI=0
}
/*****************主函数******************/
voidmain(void)
{
InitUART();//串行口初始化
Uart_1_SendString("*****************************\r\n");
Uart_1_SendString("************00000***********\r\n");
while(1)
{
inti;
//如果串口1接收到数据,将此数据由串口2发送
if(flag1==1)
{
flag1=0;
for(i=0;i -->
回复

使用道具 举报

千问 | 2021-1-27 05:20:35 | 显示全部楼层

count1++;
count2++;没加限制会有溢出风险
其他没看出什么
回复

使用道具 举报

千问 | 2021-1-27 05:20:35 | 显示全部楼层
找人写程序硬件是stc12c5024ad硬件都做好了用22.1184的晶振用2片hc244做12路输入一个64位的拨码开关做地址输入4片tpic6b595做2组输出一个485和西门子plc200做通信用plc的程序写好了实现12路乘n地址的输入的计数报警显示的
QQ39084813
回复

使用道具 举报

千问 | 2021-1-27 05:20:35 | 显示全部楼层
在串口2接收中断中flag2没有赋值。主程序中判断flag2就会没收到数。
你没仿真器吗?用仿真器在中断中下个断点,很容易就跟出毛病了。
回复

使用道具 举报

千问 | 2021-1-27 05:20:35 | 显示全部楼层
清中断标志位了没
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行