找回密码
 立即注册

QQ登录

只需一步,快速开始

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

哪位大佬有用单片机串口发送接收long int数据的经验?

  [复制链接]
跳转到指定楼层
楼主
ID:253896 发表于 2019-3-27 11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做个小玩意儿遇到了点麻烦,要求用串口通信,但我要传输的数据是long int型的,要在程序上做修改,不知道哪位大佬有用串口发送接收long int数据的经验,求分享谢谢
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2019-3-27 22:07 | 只看该作者
那你的程序呢
回复

使用道具 举报

板凳
ID:213173 发表于 2019-3-28 07:29 | 只看该作者
把 long、int 型数据按字节拆分发送,接收方收到后再还原。这种自定义通讯协议都会包含数据类型和长度信息。例如:
        int  x;
        char a,b;
        //拆分
        a=x>>8;
        b=x;
        //合并
        x=(int)(a<<8)|b;
回复

使用道具 举报

地板
ID:388197 发表于 2019-3-28 11:18 | 只看该作者
可以用联合体,一个LONG的64位拆分成4个8位的CHAR
回复

使用道具 举报

5#
ID:388197 发表于 2019-3-28 11:26 | 只看该作者
以前的代码,你可以参考下.里面传的是float,long int只要改下就行了
//=================头文件======================
#ifndef __UART_H_
#define __UART_H_
#include <stc8f.h>
#include <intrins.h>
typedef union                                   //float联合体
{
        float value;
        unsigned char byte[4];
}float_data;

#define FOSC 11059200UL                         //晶振频率
#define BRT (65536-FOSC/9600/4)                 //波特率设置

void UartInit();
void UartSend(char dat);
void SendUint(unsigned int value);
void UartSendStr(char *p);
void SendFloat(float_data* float_union);

#endif

//===================C文件=====================
#include "uart.h"

char Uart_get_char;

void UartIsr() interrupt 4
{
        RI = 0;
        Uart_get_char = SBUF;           //读
}

void UartInit()
{
        SCON = 0x50;
        T2L = BRT;                 //波特率设置
        T2H = BRT>>8;
        AUXR = 0x15;
        ES = 1;
        EA = 1;
}

void UartSend(char dat)      //送1个字节
{
        SBUF = dat;
        while(!TI);
        TI = 0;
}

void SendUint(unsigned int value)  //送U16数据
{
        unsigned char valueH = 0;
        unsigned char valueL = 0;
        valueL |= value;
        valueH |= value >> 8;
        UartSend(valueL);
        UartSend(valueH);
       
}

void SendFloat(float_data* float_union)  //送float数据
{
        UartSend(float_union->byte[3]);
        UartSend(float_union->byte[2]);
        UartSend(float_union->byte[1]);
        UartSend(float_union->byte[0]);
}
//==============================================
基本都是从手册上照搬的代码,稍作修改整理就行了.
回复

使用道具 举报

6#
ID:158375 发表于 2019-3-28 11:38 | 只看该作者
觉得串口通信时数据的收发你根本不明白,还是多学点基础的东西吧。
我觉得你根本不知道什么是 long int数据 。
回复

使用道具 举报

7#
ID:123289 发表于 2019-3-28 13:26 | 只看该作者
同意6楼意见
回复

使用道具 举报

8#
ID:426861 发表于 2019-3-28 14:45 | 只看该作者
设置一个数组,用帧传输。
回复

使用道具 举报

9#
ID:166751 发表于 2019-3-28 15:41 | 只看该作者
定义一个字节数组,如果是需要接收数据,就用数组先接收,接收完毕之后再计算,如果是发送,通过程序将数据分成一个一个的字节,然后通过串口一个一个的发送字节。
回复

使用道具 举报

10#
ID:500112 发表于 2019-3-28 19:11 | 只看该作者
学到了。。。新手路过
回复

使用道具 举报

11#
ID:253896 发表于 2019-3-28 20:46 | 只看该作者
cjm82 发表于 2019-3-28 11:26
以前的代码,你可以参考下.里面传的是float,long int只要改下就行了
//=================头文件=========== ...

谢谢
回复

使用道具 举报

12#
ID:253896 发表于 2019-3-28 20:52 | 只看该作者
笨笨兔 发表于 2019-3-28 11:38
觉得串口通信时数据的收发你根本不明白,还是多学点基础的东西吧。
我觉得你根本不知道什么是 long int数 ...

谢谢批评
回复

使用道具 举报

13#
ID:416287 发表于 2019-3-28 21:02 | 只看该作者
首先你要明白串口接收和发送最大数据为多大255  然后把你接收 发送数据进行分解 或者合并 如果是发送数据 date大于255 可以这样 date_h=(date&0xff00)>>8; date_l=date&0xff; 然后分别发送  这就是发送时的分解   然后接收就是合并 date=(date_h<<8)|date_l;  我认为是这样的。希望可以帮助你。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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