想用无线串口模块实现pc和单片机的通信的问题?高分求赐教。。。。

2025-02-24 14:41:48
推荐回答(4个)
回答1:

我之前用过nRF905 y用得人挺多的,我可以写你看看两个程序 发送程序 和接受程序 无线模块一般要分两个模块 一个是发送模块 一个接收模块 总共就是有两个程序要写 你上面的一个程序就是发送程序 通俗点就是把要发送的数据写入无线模块 然后另一块在写一个接收程序 这样就可以进行数据的传输了

发送部分:

//*************此程序为nRF905的发送程序***********

#include
#include
#define uchar unsigned char
#define uint unsigned int

//*******************定义命令字**********************
#define WC 0x00 // Write configuration register command
#define RC 0x10 // Read configuration register command
#define WTP 0x20 // Write TX Payload command
#define RTP 0x21 // Read TX Payload command
#define WTA 0x22 // Write TX Address command
#define RTA 0x23

//*******************管脚配置*********
sbit MOSI=P2^0;
sbit CSN=P2^3;
sbit SCK=P2^6;
sbit MISO=P2^7;
sbit TRX_CE=P0^5;
sbit TXEN=P0^3;
sbit PWR=P0^2;
sbit DR=P0^0;

uchar Txbuf[4]={0xf9,0xa4,0xb0,0x99};
uchar Rfconfig[10]={0x4c,0x0e,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde};

//------------------------------------------------
void delay(uint x)
{
uint i;
for(i=0;i {
_nop_();
}
}

//------------------------------------------------
void Spiwrite(uchar dat)
{
uchar i=8;
while(i--)
{
delay(10);
SCK=0;
MOSI=(bit)(dat&0x80);
dat<<=1;
delay(10);
SCK=1;
delay(10);
SCK=0;
}
SCK=0;
}

//------------------------------------------------
void Txpacket(void)
{
TXEN=1;
CSN=0;
Spiwrite(0x22);
Spiwrite(0xe7);
Spiwrite(0xe7);
Spiwrite(0xe7);
Spiwrite(0xe7);
CSN=1;
_nop_();_nop_();
CSN=0;
Spiwrite(0x20);
Spiwrite(Txbuf[0]);
Spiwrite(Txbuf[1]);
Spiwrite(Txbuf[2]);
Spiwrite(Txbuf[3]);
CSN=1;
_nop_();_nop_();
TRX_CE=1;
delay(50);
// TRX_CE=0;
while(!DR);
}

//--------------------------------------------------
void ini_system(void)
{
uchar i;
CSN=1;
SCK=0;
PWR=1; // PWR_UP | TRX_CE |TXEN | M O D E
TRX_CE=0; // 1 | 0 | 0 | SPI Programming
TXEN=0;
_nop_();
CSN=0;
Spiwrite(0x00);
for(i=0;i<10;i++)
{
Spiwrite(Rfconfig[i]);
}
CSN=1;
}

//-------------------------------------------------
void setmode()
{

PWR=1; // PWR_UP TRX_CE TXEN MODE
TRX_CE=1; // 1 1 1 SHOCKBURST TX
TXEN=1;
delay(1000); //time must be >=650us
}

//-----------------------------------------------------
void main()
{
ini_system();
while(1)
{
setmode();
Txpacket();
}
}

接收程序:

/*****接收时用数码管显示接收到的数据**********/

#include
#include

#define uchar unsigned char
#define uint unsigned int
#define led P0

#define WC 0x00
#define RC 0x10
#define WTP 0x20
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24

sbit TXEN=P3^5;
sbit TRX_CE=P3^4;
sbit PWR=P3^6;
sbit MISO=P3^0;
sbit MOSI=P1^2;
sbit SCK=P1^4;
sbit CSN=P1^3;

sbit DR=P1^1;
sbit CD=P1^0;

sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;

sbit led1=P2^3;
sbit led2=P2^5;
sbit led3=P2^6;
sbit led4=P2^7;

unsigned char Rxbuf[4]={0xf9};
unsigned char Rfconfig[10]={0x4c,0x0e,0x44,0x04,0x04,0xe7,0xe7,0xe7,0xe7,0xde};

void delay(uint x)
{
uint i;
for(i=0;i {
_nop_();
}
}

void Spiwrite(uchar dat)
{
uchar i=8;
while(i--)
{
delay(10);
SCK=0;
MOSI=(bit)(dat&0x80);
dat<<=1;
delay(10);
SCK=1;
delay(10);
SCK=0;
}
SCK=0;
}

unsigned char Spiread(void)
{
uchar i=8;
uchar ddat;
while(i--)
{
ddat<<=1;
SCK=0;
_nop_();
_nop_();
ddat|=MISO;
SCK=1;
_nop_();_nop_();
}
SCK=0;
return ddat;
}

void Rxpacket(void)
{

unsigned char j=0;
TRX_CE=0;
PWR=1;
CSN=0;
Spiwrite(RRP);
for(j=0;j<4;j++)
{
Rxbuf[j]=Spiread();
}
CSN=1;

}

void ini_system(void)
{
uchar i;
CSN=1;
SCK=0;
PWR=1; // PWR_UP | TRX_CE |TXEN | M O D E
TRX_CE=0; // 1 | 0 | 0 | SPI Programming
TXEN=0;
_nop_();
CSN=0;
Spiwrite(WC);
for(i=0;i<10;i++)
{
Spiwrite(Rfconfig[i]);
}
CSN=1;
}

void setmode()
{

PWR=1; // PWR_UP TRX_CE TXEN MODE
TRX_CE=1; // 1 1 0 SHOCKBURST RX
TXEN=0;
delay(300); //time must be >=650us
}

void display()
{
led1=0;
led2=1;
led3=1;
led4=1;
led=Rxbuf[0];
delay(1);

led1=1;
led2=0;
led3=1;
led4=1;
led=Rxbuf[1];
delay(1);

led1=1;
led2=1;
led3=0;
led4=1;
led=Rxbuf[2];
delay(1);

led1=1;
led2=1;
led3=1;
led4=0;
led=Rxbuf[3];
delay(1);

}

void main()
{
ini_system();
setmode();
while(1)
{

Rxpacket();
while(!DR);
display();
}

}

回答2:

我也做过直接有线换成无线的,程序上我没有什么改变,我是用C#自己编的上位机,然后通过max232接到无线模块,然后单片机直接与另一个无线模块相连,就可以了,与有线连接没有太大差别,至少软件上我没有做调整!
由于回答不能淘宝连接,具体什么模块可以给我发信息!

回答3:

行肯定行,我用2401做过。但肯定比有线的麻烦。

回答4:

不是 有 IP-Link 1223-5142 无线Mesh组网模块 2.4GHz;RS-232/RS-485接口;250Kbps;传输距离可达1200M;支持625K增强模式 吗? 不是很清楚你的