找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1261|回复: 2
打印 上一主题 下一主题
收起左侧

请教如何做优化单片机串口发送程序

[复制链接]
跳转到指定楼层
楼主
ID:734017 发表于 2021-10-26 11:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
code uchar HMI1[4]= {0xcc,0x33,0xc3,0x3c};       //帧尾
uchar Switching_coordinates[13]={0x00};         // 数据缓存
code uchar Powerout[6]={0xAA,0x00,0xcc,0x33,0xc3,0x3c};     //帧头


void HMI_switch(uchar number,int Xs,int Ys,int Xe,int Ye,int X,int Y)      //因为输座标麻烦,不方便移植 ,所以自动拆高底位

{
                        send_string( HMI2_switch,2);                    //发帧头
                        Switching_coordinates[0]=number;         //图片编号
                        Switching_coordinates[1]=(uchar)(Xs>>8);
                        Switching_coordinates[2]=(uchar)Xs;
                        Switching_coordinates[3]=(uchar)(Ys>>8);
                        Switching_coordinates[4]=(uchar)Ys;
                        Switching_coordinates[5]=(uchar)(Xe>>8);
                        Switching_coordinates[6]=(uchar)Xe;
                        Switching_coordinates[7]=(uchar)(Ye>>8);
                        Switching_coordinates[8]=(uchar)Ye;
                        Switching_coordinates[9]=(uchar)(X>>8);
                        Switching_coordinates[10]=(uchar)X;
                        Switching_coordinates[11]=(uchar)(Y>>8);
                        Switching_coordinates[12]=(uchar)Y;
                        send_string(Switching_coordinates,13);     //发数据
                        send_string(HMI1,4);          //帧尾
}



mian{
while(1)

   HMI_switch(0x02,0x0150,0x01d0,0x01c8,0x0248,0x0150,0x01d0);     //每秒发一次


if (ul_clok_satar)
          {
                 ul_clok_satar=~ul_clok_satar;
                          PWMCounter++;                                       
                                       
                                if(PWMCounter<=ul_PWMCounterSATAT[ul])
                                        ul_PWM=1;
                                
                                else
                                        ul_PWM=0;
                          

                        if(PWMCounter>=200)
                              PWMCounter=0;









}


void TM0_Isr() interrupt 1                                        //100US
{        
        
        
        if(facecare)                                                                                                                                         
                {
                        facecare_Time_Counter=~facecare_Time_Counter;
                }
        if (ul_satar|clok_satar)
                {
                        ul_clok_satar=~ul_clok_satar;
                        
                }
        
  }



每次到发送的时候,串口占用时间过长,定时器虽然反转了,主程序跟不上。PWM会有0.2MS偏差
我是把计数写在中断直接处理输出。还是怎么改一下 定时器1已经被另一路高速PWM占用了。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:23640 发表于 2021-10-26 15:19 | 只看该作者
定时器中断频率太高了吧
回复

使用道具 举报

板凳
ID:624769 发表于 2021-10-26 18:27 | 只看该作者
做一个缓冲池,把需要串口发送的内容先全部送入缓冲,然后,改写串口发送部分,不要用 while(TI);  用if(TI);  用计数方式,每发一个字节 计数 +1,入口判断if(Ti); 那么进入发下一字节,下一字节赋值给SBUF之后,立刻出来,去执行if (ul_clok_satar) 里面的内容,然后再回来判断 if(TI); 决定是否发送下一字节。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表