1. 程式人生 > >PIC24串列埠傳送和接收程式

PIC24串列埠傳送和接收程式

做智慧家居時,下位機用的時PIC24FJ64GA004,所以寫了下面那個程式。

由於對PIC24的不熟悉,忘了加配置們,導致波特率一直不對,後面加上配置位就行了。

接收的資料按一定格式,用來控制繼電器。

傳送的資料暫時沒用到。啟用傳送只要使能中斷就行。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 /********************************************************* *         PIC24串列埠傳送和接收     * * 文    件: main.c * 作    者: ZhnJa * 修改日期: 2013-4-6 * 說明: 9600波特率,暫時關閉傳送。 ************************************************************/ #include "p24FJ64GA004.h" #define RELAY1  LATBbits.LATB14 #define RELAY2  LATBbits.LATB13
// Setup configuration bits _CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF &  FWPSA_PR32 & WDTPS_PS2048 & ICS_PGx3)    // JTAG/Code Protect/Write Protect/Clip-on Emulation mode/ Watchdog Timer/ICD pins select _CONFIG2(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMOD_HS & FNOSC_PRI)  
// Disable CLK switch and CLK monitor, OSCO or Fosc/2, HS oscillator,Primary oscillator void UART2Init(void); void Delay(unsigned int t); unsigned char Rev[6];//接收陣列 unsigned char Send[10]={0x69,1,2,3,4,5,6,7,8,9};//傳送陣列 unsigned char i=0;//傳送位 unsigned char Index=0;//接收位 int main(void) { TRISBbits.TRISB13 = 0;//IO方向初始化 TRISBbits.TRISB14 = 0; TRISBbits.TRISB5 = 1; UART2Init(); while(1) {            //接收判斷 if(Rev[0]==0x68 && Rev[2]==0x69) { if(Rev[3]==0x01) { if(Rev[4] == 1) RELAY1 = 1; if(Rev[4] == 0) RELAY1 = 0; }    if(Rev[3]==0x02) { if(Rev[4] == 1) RELAY2 = 1; if(Rev[4] == 0) RELAY2 = 0; }    } }    return 0; } /***************************************************************** ** Name:    UART2Init ** Function: 串列埠2初始化 ** Input:     ** Output:    ** Time:     2013.4.05 ** Attention: 11.0596MHz,9600bunds ******************************************************************/ void UART2Init(void) { TRISCbits.TRISC5 = 1;//IO口方向 TRISCbits.TRISC4 = 0; RPINR19bits.U2RXR = 21;//RP21 RPOR10bits.RP20R = 5;//RP20 U2MODEbits.BRGH = 1;//高速 U2BRG = 143;    //波特率 U2STAbits.UTXISEL0 = 0;//當最後一個字元被移出傳送移位暫存器時產生中斷 U2STAbits.UTXISEL1 = 0; U2MODEbits.UARTEN = 1; SRbits.IPL = 3//CPU優先順序3 IPC7bits.U2TXIP = 4//傳送中斷優先順序4 IEC1bits.U2TXIE = 1//允許傳送中斷 IFS1bits.U2TXIF = 0//清標誌位 IPC7bits.U2RXIP=5//接收中斷優先順序 IEC1bits.U2RXIE=1//允許接收中斷 IFS1bits.U2RXIF=0//清標誌位 //  U2STAbits.UTXEN = 1; //使能傳送,同時產生髮送中斷 }    /***************************************************************** ** Name:     _U2TXInterrupt ** Function: 串列埠2接收中斷 ** Input:     ** Output:    ** Time:     2013.4.05 ** Attention:  ******************************************************************/ void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(void) { unsigned char temp;  IFS1bits.U2RXIF=0//清標誌位 temp=U2RXREG; if(temp == 0x68)    //判斷是否為第一位 Index = 0; if(Index>=sizeof(Rev)) Index=0; Rev[Index]=temp; Index++; } /***************************************************************** ** Name:     _U2TXInterrupt ** Function: 串列埠2傳送中斷 ** Input:     ** Output:    ** Time:     2013.4.05 ** Attention:  ******************************************************************/ void __attribute__((interrupt, no_auto_psv)) _U2TXInterrupt(void) { IFS1bits.U2TXIF = 0//清中斷標誌         U2TXREG = Send[i] ;  //傳送資料  while(U2STAbits.TRMT == 0);  Nop();Nop();Nop();Nop();         i++; if(i==10) { i=0;     }        } void Delay(unsigned int t) { unsigned int i,j; for(i=t;i>4;i--) for(j=1;j<10000;j++); }

相關推薦

PIC24串列傳送接收程式

做智慧家居時,下位機用的時PIC24FJ64GA004,所以寫了下面那個程式。 由於對PIC24的不熟悉,忘了加配置們,導致波特率一直不對,後面加上配置位就行了。 接收的資料按一定格式,用來控制繼電器。 傳送的資料暫時沒用到。啟用傳送只要使能中斷就行。 1

微控制器串列傳送接受程式

include "config.h" /******************************串列埠1的波特率********************************/ //T1作波特率發生器 //在波特率加倍情況下  #define BAUD_57600 2

linux多執行緒下開啟串列傳送接收資料

1 啟動執行緒1讀串列埠 2 等待3秒後 3 啟動執行緒2寫串列埠,傳送字串後關閉 4 等待10秒 5 關閉兩個執行緒 #include <pthread.h> #include <stdio.h> #include <sys/time.h> #include &

gsm模組 POST協議 串列傳送接收(sim900a)

串列埠發:AT+CIPSTART="TCP","211.xxx.xxx.xxx",80 串列埠收:OK CONNECT OK 串列埠發:AT+CIPSEND=533                                    (下面串列埠傳送資料的長度) 串列埠收

esp8266-SDK的串列傳送中斷接收

其實用esp8266編寫串列埠程式非常簡單,因為它都給我們寫好了,只要呼叫 uart_init(115200,115200);這個函式就可以。 1、傳送 呼叫uart_init(115200,115200);初始化串列埠,波特率設定為115200.前面一個是設定uart0

keil編譯的程式 “漢字顯示不全、串列傳送漢字接收後亂碼缺失”問題

今天知道一個keil的bug,就是當漢字的機內碼包含0xfd時,keil就會自動丟棄fd,mark一下。 解決方法: 1、遇到帶有fd的漢字採用機內碼替代, 2.給keil打補丁。具體過程可百度

用C寫一個UDP傳送接收程式

1、UDP網路程式設計主要流程 UDP協議的程式設計框架,客戶端和伺服器之間的差別在於伺服器必須使用bind()函式來繫結偵聽的本地UDP埠,而客戶端則可以不進行繫結,直接傳送到伺服器地址的某個埠地址。框圖如圖1.3所示 UDP協議的伺服器端流程 伺服器流程主要分為下述6個部分,即建立套

【ESP8266】NONOS SDK開發,串列傳送接收與中斷

ESP8266感覺要成現在物聯網的黑馬了,整合WiFi功能、能程式設計,還便宜,確實挺6的。 就是能提供的資料太少,感覺官網上的遠遠不夠用,這個串列埠收發與中斷折騰了我是在太久,在這裡小的就分享一下自己的經驗。 大家都問我要工程,我終於可以上傳啦: http://d

STM32F103配置串列中斷服務函式並接收double雙精度資料,python傳送接收雙精度資料

(1)首先,我們要進行串列埠中斷服務函式的配置 void USART1_Config(void) {         GPIO_InitTypeDef GPIO_InitStructure;     &nb

Java實現RS485串列通訊,傳送接收資料進行解析

  最近專案有一個空氣檢測儀,需要得到空氣檢測儀的實時資料,儲存到資料庫當中。根據瞭解得到,硬體是通過rs485進行串列埠通訊的,需要傳送16進制命令給儀器,然後通過輪詢來得到資料。   需要先要下載RXTX的jar包,win64位下載地址:http://pan.baidu.com/s/1o6zLmTc);

STM32串列傳送資料接收資料方式總結

       之前寫了篇關於ESP8266使用AT指令進行互相通訊的實驗,在寫STM32串列埠接發資料的程式中,覺得有必要將之前學的有關於串列埠方面的使用經歷加以總結。 串列埠傳送資料:        1. 串列埠傳送資料最直接的方式就是標準呼叫庫函式 。 void

windows下C語言版串列傳送程式(基於VS2017)

#include "pch.h" #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <windows.h> #include <string.h> #include <conio.h&

ARM40-A5應用程式——CAN匯流排的傳送接收

ARM40-­A5應用程式——CAN匯流排的傳送和接收 版權宣告:本文為博主原創文章,允許轉載。      ARM40-A5系列板卡共有2路隔離CAN匯流排,CAN匯流排的引腳定義見《ARM40-­A5指南——CAN匯流排介面與測試》。 一、shell中CAN匯流排的接收與傳送

sendrecv只是核心緩衝區應用程式緩衝區之間的搬運工---嚴格來講sendrecv並不具備傳送接收功能

       談到網路socket程式設計, 我們不得不提兩個基本也很重要的函式:send和recv.  對socket程式設計理解不深的童鞋容易產生這樣一個錯誤的認識: send函式是用來發送資料, 而recv函式是用來接收資料的, 其實, 這種觀點是稍微有點

串列傳送字串十六進位制原始碼

 /**   * @brief  USART GPIO 配置,工作引數配置   * @param  無   * @retval 無   */ void USART_Config(void) {     GPIO_InitTypeDef GPIO_InitStructure;

FPGA-串列通訊的接收模組(傳送接收模組)

接收模組和傳送模組類似:        在接收的過程中為了保證接收資料的準確性對單個時鐘波特率進行分頻,單個時鐘訊號下分頻16次,進行資料採集保證了資料的準確性,這裡的程式碼思想借鑑了小梅哥的程式碼的編寫思想。 傳送接收模組的驗證:  

FPGA實驗——串列傳送/接收學習筆記

1. 基礎知識  1.1 波特率的概念          波特率(Baud rate),指的是訊號被調製以後在單位時間內的變化,即單位時間內載波引數變化的次數,如每秒鐘傳送240個字元,而每個字元格式包含10位(1個起始位,1個停止位,8個數據位),這時的波特率為2

UDP網路程式傳送接收資料

建立一個基於udp的網路程式流程很簡單,具體步驟如下: 1.建立客戶端套接字 2.傳送/接收資料 3.關閉套接字 UDP傳送和接收資料 在 Python 中 使用socket 模組的函式 socket 就可以完成: import socket #

Unity3D內部串列通訊Unity3D與Winform程式串列通訊的實現異常問題

前言 1、有些人其實會覺得Unity3D用到的.NET是2.0的,其實不然;Unity3D有用到.NET3.5,為什麼說Unity用到的是3.5呢,從一個很常用卻很重要的一個名稱空間說起,他就是System.Linq名稱空間,這個名稱空間是.NET3.5重要的

STC89C52微控制器——串列傳送程式1

/*----------------------------------------------- 名稱:串列埠通訊 編寫:LZM 日期:2015.05 修改:無 內容:連線好串列埠波特率設定為9600,無奇偶校驗 晶振11.0592