久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4538|回復: 12
收起左側

哪位大佬有用單片機串口發送接收long int數據的經驗?

  [復制鏈接]
ID:253896 發表于 2019-3-27 11:55 | 顯示全部樓層 |閱讀模式
最近做個小玩意兒遇到了點麻煩,要求用串口通信,但我要傳輸的數據是long int型的,要在程序上做修改,不知道哪位大佬有用串口發送接收long int數據的經驗,求分享謝謝
回復

使用道具 舉報

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
回復

使用道具 舉報

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]);
}
//==============================================
基本都是從手冊上照搬的代碼,稍作修改整理就行了.
回復

使用道具 舉報

ID:158375 發表于 2019-3-28 11:38 | 顯示全部樓層
覺得串口通信時數據的收發你根本不明白,還是多學點基礎的東西吧。
我覺得你根本不知道什么是 long int數據 。
回復

使用道具 舉報

ID:123289 發表于 2019-3-28 13:26 | 顯示全部樓層
同意6樓意見
回復

使用道具 舉報

ID:426861 發表于 2019-3-28 14:45 | 顯示全部樓層
設置一個數組,用幀傳輸。
回復

使用道具 舉報

ID:166751 發表于 2019-3-28 15:41 | 顯示全部樓層
定義一個字節數組,如果是需要接收數據,就用數組先接收,接收完畢之后再計算,如果是發送,通過程序將數據分成一個一個的字節,然后通過串口一個一個的發送字節。
回復

使用道具 舉報

ID:500112 發表于 2019-3-28 19:11 | 顯示全部樓層
學到了。。。新手路過
回復

使用道具 舉報

ID:253896 發表于 2019-3-28 20:46 | 顯示全部樓層
cjm82 發表于 2019-3-28 11:26
以前的代碼,你可以參考下.里面傳的是float,long int只要改下就行了
//=================頭文件=========== ...

謝謝
回復

使用道具 舉報

ID:253896 發表于 2019-3-28 20:52 | 顯示全部樓層
笨笨兔 發表于 2019-3-28 11:38
覺得串口通信時數據的收發你根本不明白,還是多學點基礎的東西吧。
我覺得你根本不知道什么是 long int數 ...

謝謝批評
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本超碰| 欧美日韩亚洲一区 | 一本一道久久a久久精品蜜桃 | 国产成人艳妇aa视频在线 | 美女在线观看国产 | 色综合久 | 在线看片网站 | 欧美一区视频 | 亚洲午夜在线 | 中文字幕国产精品 | 色综合99| 亚洲精品欧美 | 国产精品亚洲综合 | 综合精品久久久 | 国产毛片av | 91久久国产综合久久91精品网站 | 2018中文字幕第一页 | 3p视频在线观看 | 日韩中文字幕一区二区 | 国产精品毛片一区二区在线看 | 国产视频三区 | 国产你懂的在线观看 | 九九久久免费视频 | 成人国产精品视频 | 日韩成人国产 | 精品久久久久国产免费第一页 | 亚洲一二三区精品 | 亚洲综合成人网 | 亚洲精品乱码久久久久久蜜桃 | 欧美xxxx日本 | 真人毛片 | 成年人免费在线视频 | 熟女毛片| 久久久久久国产精品免费免费 | 狠狠干网 | 狠狠干美女 | 中文字幕精品一区二区三区精品 | 天天澡天天操 | 日本不卡高清视频 | 久草视频在线播放 | 男女视频在线观看免费 |