TI的TMS320F28335,试图通过RS485串口进行SCI-B通信。目前不知道为什么只能收不能发。上位机可以传输数据到下位机(TI板)却无法收到下位机传出的数据。
无论是串口助手还是MATLAB都无法收到数据。
如果可以的话还想问一下怎么样在VS code里运行这个,不想用CCS了。
//###########################################################################
//
// FILE: lab12-SCIB_RS485_PC
//
//
//
//
// $Boot_Table:
//
// GPIO87 GPIO86 GPIO85 GPIO84
// XA15 XA14 XA13 XA12
// PU PU PU PU
// ==========================================
// 1 1 1 1 Jump to Flash
// 1 1 1 0 SCI-A boot
// 1 1 0 1 SPI-A boot
// 1 1 0 0 I2C-A boot
// 1 0 1 1 eCAN-A boot
// 1 0 1 0 McBSP-A boot
// 1 0 0 1 Jump to XINTF x16
// 1 0 0 0 Jump to XINTF x32
// 0 1 1 1 Jump to OTP
// 0 1 1 0 Parallel GPIO I/O boot
// 0 1 0 1 Parallel XINTF boot
// 0 1 0 0 Jump to SARAM <- "boot to SARAM"
// 0 0 1 1 Branch to check boot mode
// 0 0 1 0 Boot to flash, bypass ADC cal
// 0 0 0 1 Boot to SARAM, bypass ADC cal
// 0 0 0 0 Boot to SCI-A, bypass ADC cal
// Boot_Table_End$
//
//
//
//###########################################################################
//###########################################################################
#include "DSP2833x_Device.h" // DSP2833x
#include "DSP2833x_Examples.h" // DSP2833x
#include "stdlib.h"
/*
Transmission Protocol by Tao Ran and Li Yu;
Date: 2023.05.23;
sysState (1 bit) -> Start = 1 / Stop = 0;
CtrlMode (3 bit) -> Voltage = 000, Current = 001, Ikp = 010, Iki = 011, Icmd = 100, Xcmd = 101, Xkpi = 110, Xkd = 111;
Channel (4 bit) -> 1 = 0001, 2 = 0010, 3 = 0011, 4 = 0100, 5 = 0101, 6 = 0110, 7 = 0111, 8 = 1000, 9 = 1001, 10 = 1010;
Value -> 4 byte float;
Transmit 6 byte a time: message = sysState + CtrlMode + Channel + Value + transmission;
*/
// A -> 0 100 0001 -> stop + Icmd + channel 1;
/*
typedef struct DataPacket {
unsigned sysState : 1; // 1 bit
unsigned CtrlMode : 3; // 3 bits
unsigned Channel : 4; // 4 bits
float Value; // 4 bytes
} DataPacket;
*/
typedef struct DataPacket {
unsigned char state : 8;
float Value; // 4 bytes
unsigned char R_or_T : 8; // Receive or Transmit -> 0x0 = Receive, 0xff = Transmit
} DataPacket;
union CharFloat{ // unsigned char <-> float
unsigned char str[2];
float V;
};
float duty1cmd = 2, duty2cmd, duty3cmd, duty4cmd, duty5cmd, duty6cmd, duty7cmd, duty8cmd, duty9cmd, duty10cmd; // Voltage
float I1Cmd, I2Cmd, I3Cmd, I4Cmd, I5Cmd, I6Cmd, I7Cmd, I8Cmd, I9Cmd, I10Cmd; // Current
float I1kpi [2], I2kpi [2], I3kpi [2], I4kpi [2], I5kpi [2], I6kpi [2], I7kpi [2], I8kpi [2], I9kpi [2], I10kpi [2]; // Ikpi
float IpCmdX, InCmdX, IpCmdY, InCmdY, IpCmdZ, InCmdZ; // Icmd
float Xcmd[5]; //Xcmd
float X1kpid[3], X2kpid[3], Y1kpid[3], Y2kpid[3], Zkpid[3]; // Xkpid
unsigned char data0 = 0, data1 = 0x0, data2 = 0x0, data3 = 0x0, data4 = 0x0, data5 = 0, data6 = 0, data7 = 0, data8 = 0, data9 = 0;
unsigned char Channel = 0, sys_state = 0, ctrl_mode = 0;
float f_value = 0;
int t_time = 0;
unsigned char t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0;
unsigned char tran_temp = 0;
DataPacket Packet;
union CharFloat F;
/**********************************************************************************************/
void scib_echoback_init(void);
void scib_xmit(unsigned char byte);
void scib_msg(unsigned char *byte_ptr);
void scib_fifo_init(void);
void Update(void);
void Receive(unsigned char *byte_ptr);
void Transmit(unsigned char *byte_ptr);
void processCtrlMode(void);
void setDuty (void);
void setCurrent (void);
void setIkp (void);
void setIki (void);
void setIcmd (void);
void setXcmd (void);
void setXkpi (void);
void setXkd (void);
void ReadCtrlMode(void);
void ReadDuty (void);
void ReadCurrent (void);
void ReadIkp (void);
void ReadIki (void);
void ReadIcmd (void);
void ReadXcmd (void);
void ReadXkpi (void);
void ReadXkd (void);
unsigned char scib_rxmit ();
/**********************************************************************************************/
/**********************************************************************************************/
#define InitDIR() \
EALLOW; \
GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0; \
GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1; \
GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1; \
EDIS;
#define RX_EN GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1;
#define TX_EN GpioDataRegs.GPBSET.bit.GPIO49 = 1;
/**********************************************************************************************/
enum MODE Mode;
enum CTRLMODE CtrlMode;
enum SYSSTATE sysState;
enum DATA Data;
enum DATA {
position,
Current
};
enum SYSSTATE {
start,
stop
};
enum CTRLMODE {
voltage,
current,
pid,
VibCtrl_CTM,
PosTuning
};
enum MODE {
debugging,
operat
};
/********************************************************************************************************/
void main(void)
{
InitSysCtrl();
InitScibGpio();
InitDIR();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
scib_echoback_init();
sysState = stop;
CtrlMode = voltage;
Data = position;
Mode = debugging;
while(1){ // No need for for-loop, just go while(1). Updated 2023.05.24 by Tao Ran
/*
unsigned char test = 0xff;
scib_xmit(test);
*/
// Update function now handles the receive and processing of a data packet
Update();
}
}
void Update(){ //Updated 2023.05.25 by Tao Ran
unsigned char *byte_ptr = (unsigned char*) &Packet;
// Now handle the data from the packet
Receive(byte_ptr);
if (data5 == 0xff){ // Transmit the data if the packet request transmission
Transmit(byte_ptr);
}else if (data5 == 0x00){ // Update the data if the packet request reception
// Convert the data from the packet to a float
F.str[0] = (data2<<8) + data1;
F.str[1] = (data4<<8) + data3;
f_value = F.V;
// sysState processing
(sys_state == 0)? (sysState = stop) : (sysState = start);
// Channel processing
processCtrlMode();
}
}
void Receive (unsigned char *byte_ptr){
// Read the 6 bytes into our struct
int i = 0;
for(i = 0; i < 6; i++){
unsigned char temp;
temp = scib_rxmit();
byte_ptr[i] = temp;
//byte_ptr[i] = scib_rxmit(); // assuming this is the function to receive a byte
switch(i){
case 0:
data0 = temp; // data0 is state
break;
case 1:
data1 = temp; // data1 is float value byte 1
break;
case 2:
data2 = temp; // data2 is float value byte 2
break;
case 3:
data3 = temp; // data3 is float value byte 3
break;
case 4:
data4 = temp; // data4 is float value byte 4
break;
case 5:
data5 = temp; // data5 is recieve or transmit state
break;
default:
break;
}
}
/*
byte_ptr[i] = scib_rxmit();
byte_ptr[i] = scib_rxmit();
*/
unsigned char temp = data0;
Channel = temp &= 0b00001111;
temp = data0;
sys_state = temp &= 0b10000000;
temp = data0;
ctrl_mode = (temp &= 0b01110000)/16;
}
void Transmit(unsigned char *byte_ptr){
byte_ptr[0] = data0;
t0 = byte_ptr[0];
ReadCtrlMode();
F.V = f_value;
unsigned char temp;
// first 2 bytes of float
temp = F.str[0];
t2 = (temp &= 0xff00)>>8;
byte_ptr[2] = t2;
t1 = (temp &= 0x00ff);
byte_ptr[1] = t1;
// last 2 bytes of float
temp = F.str[1];
t4 = (temp &= 0xff00)>>8;
byte_ptr[4] = t4;
t3 = (temp &= 0x00ff);
byte_ptr[3] = t3;
// last byte of packet
byte_ptr[5] = 0xff;
// Initiate transmission
scib_msg(byte_ptr);
}
//CtrlMode (3 bit) -> Voltage = 000, Current = 001, Ikp = 010, Iki = 011, Icmd = 100, Xcmd = 101, Xkpi = 110, Xkd = 111;
void processCtrlMode() { //Updated 2023.05.24 by Tao Ran
// Do something with CtrlMode and pass value to execute.
switch(ctrl_mode) {
case 0:
// Voltage
CtrlMode = voltage;
setDuty();
break;
case 1:
// Current
CtrlMode = current;
setCurrent();
break;
case 2:
// Ikp
CtrlMode = current;
setIkp();
break;
case 3:
// Iki
CtrlMode = current;
setIki();
break;
case 4:
// Icmd
CtrlMode = PosTuning;
setIcmd();
break;
case 5:
// Xcmd
CtrlMode = pid;
setXcmd();
break;
case 6:
// Xkpi
CtrlMode = pid;
setXkpi();
break;
case 7:
// Xkd
CtrlMode = pid;
setXkd();
break;
default:
// Error
break;
}
}
void setDuty (){
switch (Channel){
case 0b0001:
duty1cmd = f_value;
break;
case 0b0010:
duty2cmd = f_value;
break;
case 0b0011:
duty3cmd = f_value;
break;
case 0b0100:
duty4cmd = f_value;
break;
case 0b0101:
duty5cmd = f_value;
break;
case 0b0110:
duty6cmd = f_value;
break;
case 0b0111:
duty7cmd = f_value;
break;
case 0b1000:
duty8cmd = f_value;
break;
case 0b1001:
duty9cmd = f_value;
break;
case 0b1010:
duty10cmd = f_value;
break;
default:
// Error
break;
}
}
void setCurrent (){
switch (Channel){
case 0b0001:
I1Cmd = f_value;
break;
case 0b0010:
I2Cmd = f_value;
break;
case 0b0011:
I3Cmd = f_value;
break;
case 0b0100:
I4Cmd = f_value;
break;
case 0b0101:
I5Cmd = f_value;
break;
case 0b0110:
I6Cmd = f_value;
break;
case 0b0111:
I7Cmd = f_value;
break;
case 0b1000:
I8Cmd = f_value;
break;
case 0b1001:
I9Cmd = f_value;
break;
case 0b1010:
I10Cmd = f_value;
break;
default:
// Error
break;
}
}
void setIkp (){
switch (Channel){
case 0b0001:
I1kpi[0] = f_value;
break;
case 0b0010:
I2kpi[0] = f_value;
break;
case 0b0011:
I3kpi[0] = f_value;
break;
case 0b0100:
I4kpi[0] = f_value;
break;
case 0b0101:
I5kpi[0] = f_value;
break;
case 0b0110:
I6kpi[0] = f_value;
break;
case 0b0111:
I7kpi[0] = f_value;
break;
case 0b1000:
I8kpi[0] = f_value;
break;
case 0b1001:
I9kpi[0] = f_value;
break;
case 0b1010:
I10kpi[0] = f_value;
break;
default:
// Error
break;
}
}
void setIki (){
switch (Channel){
case 0b0001:
I1kpi[1] = f_value;
break;
case 0b0010:
I2kpi[1] = f_value;
break;
case 0b0011:
I3kpi[1] = f_value;
break;
case 0b0100:
I4kpi[1] = f_value;
break;
case 0b0101:
I5kpi[1] = f_value;
break;
case 0b0110:
I6kpi[1] = f_value;
break;
case 0b0111:
I7kpi[1] = f_value;
break;
case 0b1000:
I8kpi[1] = f_value;
break;
case 0b1001:
I9kpi[1] = f_value;
break;
case 0b1010:
I10kpi[1] = f_value;
break;
default:
// Error
break;
}
}
void setIcmd (){
switch (Channel){
case 0b0001:
IpCmdX = f_value;
break;
case 0b0010:
InCmdX = f_value;
break;
case 0b0011:
IpCmdY = f_value;
break;
case 0b0100:
InCmdY = f_value;
break;
case 0b0101:
IpCmdZ = f_value;
break;
case 0b0110:
InCmdZ = f_value;
break;
default:
// Error
break;
}
}
void setXcmd (){
switch (Channel){
case 0b0001:
Xcmd[0] = f_value;
break;
case 0b0010:
Xcmd[1] = f_value;
break;
case 0b0011:
Xcmd[2] = f_value;
break;
case 0b0100:
Xcmd[3] = f_value;
break;
case 0b0101:
Xcmd[4] = f_value;
break;
default:
// Error
break;
}
}
void setXkpi (){
switch (Channel)
{
case 0b0001:
X1kpid[0] = f_value;
break;
case 0b0010:
X2kpid[0] = f_value;
break;
case 0b0011:
Y1kpid[0] = f_value;
break;
case 0b0100:
Y2kpid[0] = f_value;
break;
case 0b0101:
Zkpid[0] = f_value;
break;
case 0b0110:
X1kpid[1] = f_value;
break;
case 0b0111:
X2kpid[1] = f_value;
break;
case 0b1000:
Y1kpid[1] = f_value;
break;
case 0b1001:
Y2kpid[1] = f_value;
break;
case 0b1010:
Zkpid[1] = f_value;
break;
default:
break;
}
}
void setXkd (){
switch (Channel)
{
case 0b0001:
X1kpid[2] = f_value;
break;
case 0b0010:
X2kpid[2] = f_value;
break;
case 0b0011:
Y1kpid[2] = f_value;
break;
case 0b0100:
Y2kpid[2] = f_value;
break;
case 0b0101:
Zkpid[2] = f_value;
break;
default:
break;
}
}
unsigned char scib_rxmit (){
while(ScibRegs.SCIRXST.bit.RXRDY != 1); // wait for XRDY =1 for empty state
return ScibRegs.SCIRXBUF.all; // Get character
}
// Transmit a character from the SCI
void scib_xmit(unsigned char byte){
while (ScibRegs.SCICTL2.bit.TXRDY == 0); // Wait for TXRDY =1 for empty state
tran_temp = byte;
ScibRegs.SCIRXBUF.all = byte; // Send data
t_time++;
}
void scib_msg(unsigned char * byte_ptr)
{
int i = 0;
t_time = 0;
TX_EN;
while(i < 6) // Send characters until null character is reached
{
scib_xmit(byte_ptr[i]); // Send character
i++;
}
/*
scib_xmit(0x0D);
scib_xmit(0x0A);
scib_xmit(0x0D);
scib_xmit(0x0A);
*/
RX_EN;
}
// Initialize the SCI FIFO
void scib_fifo_init()
{
ScibRegs.SCIFFTX.all=0xE040;
ScibRegs.SCIFFRX.all=0x2044;
ScibRegs.SCIFFCT.all=0x0;
}
void scib_echoback_init()
{
// Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
ScibRegs.SCICTL1.bit.SWRESET =0;
ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
#if (CPU_FRQ_150MHZ)
ScibRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 37.5MHz.
ScibRegs.SCILBAUD =0x00E7;
#endif
#if (CPU_FRQ_100MHZ)
ScibRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 20MHz.
ScibRegs.SCILBAUD =0x0044;
#endif
ScibRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}
void ReadCtrlMode() { //Updated 2023.05.31 by Tao Ran
// Do something with CtrlMode and pass value to execute.
switch(ctrl_mode) {
case 0:
// Voltage
ReadDuty();
break;
case 1:
// Current
ReadCurrent();
break;
case 2:
// Ikp
ReadIkp();
break;
case 3:
// Iki
ReadIki();
break;
case 4:
// Icmd
ReadIcmd();
break;
case 5:
// Xcmd
ReadXcmd();
break;
case 6:
// Xkpi
ReadXkpi();
break;
case 7:
// Xkd
ReadXkd();
break;
default:
// Error
f_value = 0x0;
break;
}
}
void ReadDuty (){
switch (Channel){
case 0b0001:
f_value = duty1cmd;
break;
case 0b0010:
f_value = duty2cmd;
break;
case 0b0011:
f_value = duty3cmd;
break;
case 0b0100:
f_value = duty4cmd;
break;
case 0b0101:
f_value = duty5cmd;
break;
case 0b0110:
f_value = duty6cmd;
break;
case 0b0111:
f_value = duty7cmd;
break;
case 0b1000:
f_value = duty8cmd;
break;
case 0b1001:
f_value = duty9cmd;
break;
case 0b1010:
f_value = duty10cmd;
break;
default:
// Error
f_value = 0x0;
break;
}
}
void ReadCurrent (){
switch (Channel){
case 0b0001:
f_value = I1Cmd;
break;
case 0b0010:
f_value = I2Cmd;
break;
case 0b0011:
f_value = I3Cmd;
break;
case 0b0100:
f_value = I4Cmd;
break;
case 0b0101:
f_value = I5Cmd;
break;
case 0b0110:
f_value = I6Cmd;
break;
case 0b0111:
f_value = I7Cmd;
break;
case 0b1000:
f_value = I8Cmd;
break;
case 0b1001:
f_value = I9Cmd;
break;
case 0b1010:
f_value = I10Cmd;
break;
default:
// Error
break;
}
}
void ReadIkp (){
switch (Channel){
case 0b0001:
f_value = I1kpi[0];
break;
case 0b0010:
f_value = I2kpi[0];
break;
case 0b0011:
f_value = I3kpi[0];
break;
case 0b0100:
f_value = I4kpi[0];
break;
case 0b0101:
f_value = I5kpi[0];
break;
case 0b0110:
f_value = I6kpi[0];
break;
case 0b0111:
f_value = I7kpi[0];
break;
case 0b1000:
f_value = I8kpi[0];
break;
case 0b1001:
f_value = I9kpi[0];
break;
case 0b1010:
f_value = I10kpi[0];
break;
default:
// Error
f_value = 0x0;
break;
}
}
void ReadIki (){
switch (Channel){
case 0b0001:
f_value = I1kpi[1];
break;
case 0b0010:
f_value = I2kpi[1];
break;
case 0b0011:
f_value = I3kpi[1];
break;
case 0b0100:
f_value = I4kpi[1];
break;
case 0b0101:
f_value = I5kpi[1];
break;
case 0b0110:
f_value = I6kpi[1];
break;
case 0b0111:
f_value = I7kpi[1];
break;
case 0b1000:
f_value = I8kpi[1];
break;
case 0b1001:
f_value = I9kpi[1];
break;
case 0b1010:
f_value = I10kpi[1];
break;
default:
// Error
f_value = 0x0;
break;
}
}
void ReadIcmd (){
switch (Channel){
case 0b0001:
f_value = IpCmdX;
break;
case 0b0010:
f_value = InCmdX;
break;
case 0b0011:
f_value = IpCmdY;
break;
case 0b0100:
f_value = InCmdY;
break;
case 0b0101:
f_value = IpCmdZ;
break;
case 0b0110:
f_value = InCmdZ;
break;
default:
// Error
f_value = 0x0;
break;
}
}
void ReadXcmd (){
switch (Channel){
case 0b0001:
f_value = Xcmd[0];
break;
case 0b0010:
f_value = Xcmd[1];
break;
case 0b0011:
f_value = Xcmd[2];
break;
case 0b0100:
f_value = Xcmd[3];
break;
case 0b0101:
f_value = Xcmd[4];
break;
default:
// Error
f_value = 0x0;
break;
}
}
void ReadXkpi (){
switch (Channel)
{
case 0b0001:
f_value = X1kpid[0];
break;
case 0b0010:
f_value = X2kpid[0];
break;
case 0b0011:
f_value = Y1kpid[0];
break;
case 0b0100:
f_value = Y2kpid[0];
break;
case 0b0101:
f_value = Zkpid[0];
break;
case 0b0110:
f_value = X1kpid[1];
break;
case 0b0111:
f_value = X2kpid[1];
break;
case 0b1000:
f_value = Y1kpid[1];
break;
case 0b1001:
f_value = Y2kpid[1];
break;
case 0b1010:
f_value = Zkpid[1];
break;
default:
break;
}
}
void ReadXkd (){
switch (Channel)
{
case 0b0001:
f_value = X1kpid[2];
break;
case 0b0010:
f_value = X2kpid[2];
break;
case 0b0011:
f_value = Y1kpid[2];
break;
case 0b0100:
f_value = Y2kpid[2];
break;
case 0b0101:
f_value = Zkpid[2];
break;
default:
break;
}
}
1、量下向上位机发送时,RS485的方向引脚是否使能为发送了;
2、发送数据实现,先将方向引脚切换为发送,等待延时1ms左右,再将调用发送函数。
回答:
对于RS485 SCI-B通信不能发送数据的问题,可能是以下几个原因导致:
您可以检查串口的设置是否正确,例如波特率、数据位数、停止位数、奇偶校验位等是否正确设置。确保与上位机通信的设置保持一致。
您可以在发送数据时检查相应的代码是否正确,例如发送的数据是否放在正确的地址上,数据是否正确传输等。可以通过在代码中加入Debug打印,观察数据的传输情况,找到问题所在。
在RS485通信中,偏置电压非常重要。偏置电压的设置有误,可能会导致通信异常。您可以检查偏置电压是否正确设置。
针对如何在VS code中运行TMS320F28335的问题,可以使用Code Composer Studio (CCS)插件来实现。该插件为VS Code提供了与CCS密切相关的构建、调试和设置功能。在VS Code中安装TI-CCS插件后,将您的TMS320F28335项目导入VS Code,即可在VS Code中运行和调试代码。
以下是可能的解决方法(仅供参考):
c void sci_init(void) { ScibRegs.SCICCR.all = 0x0007; // 1位起始位,8位数据位,无奇偶校验位,1位停止位 ScibRegs.SCICTL1.all = 0x0003; // 使能SCI-B和SCI-B发送 ScibRegs.SCICTL2.all = 0x0003; // 接收中断使能 ScibRegs.SCIHBAUD = (baudrate >> 8) & 0xFF; ScibRegs.SCILBAUD = baudrate & 0xFF; // 波特率设置 ScibRegs.SCICTL1.all = 0x0023; // 使能SCI-B和SCI-B接收 }
c void sci_senddata(unsigned char *data, unsigned int length) { int i; for (i = 0; i < length; i++) { ScibRegs.SCITXBUF = data[i]; while (ScibRegs.SCICTL2.bit.TXEMPTY == 0) ; //等待发送完成 //scib_fifo_init(); } }
c EALLOW; GpioCtrlRegs.GPBPUD.bit.GPIO62 = 0; GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 1; GpioCtrlRegs.GPBDIR.bit.GPIO62 = 1; GpioDataRegs.GPBSET.bit.GPIO62 = 1; // 设置为高电平状态 EDIS;
a. 在VS Code中搜索TI-CCS插件进行安装,或者通过以下命令安装插件:
bash code --install-extension ti-cgt-c2000
b. 打开VS Code,导入TMS320F28335项目。
c. 在VS Code中使用CCS插件进行构建、运行和调试代码。
总之,如果您遇到任何问题,请仔细检查您的代码、工具设置和硬件连接,或者咨询相关技术支持人员寻求解决方法。
只能传输不能收发的问题,首先要检查下SCI串口通信相关配置是有问题。比如,波特率不匹配、数据位、停止位和校验位不匹配等等。需要重点检查下。其次,检查RS485的连接是否问题,比如接错了或者有损坏等。
如果你想要使用vscode运行首先需要在vscode中安装C语言支持扩展,vscode默认是什么c的扩展的,这个怎么安装你可以上网找下,很多资料的。之后再讲代码复制进去运行。
检查波特率、数据位、校验位和停止位等串口参数是不是匹配好
可以参考下
void Scib_echoback_init() // SCI初始化
{
// Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0003; // enable TX, RX, internal ScibLK,
// Disable RX ERR, SLEEP, TXWAKE
ScibRegs.SCICTL1.bit.RXERRINTENA=1; //使能错误接收中断
ScibRegs.SCICTL2.all =0x0003;
ScibRegs.SCICTL2.bit.TXINTENA = 1;
ScibRegs.SCICTL2.bit.RXBKINTENA =1;
#if (CPU_FRQ_150MHZ)
ScibRegs.SCIHBAUD =0x0000;
// 19200 baud @LSPCLK = 37.5MHz.
ScibRegs.SCILBAUD =0x00F3;
#endif
#if (CPU_FRQ_100MHZ)
ScibRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 20MHz.
ScibRegs.SCILBAUD =0x0044;
#endif
ScibRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}
interrupt void SCIRXINTB_ISR(void) // SCI-B中断
{
if(ScibRegs.SCIRXST.bit.RXERROR == 1) //SW RESET
{
ScibRegs.SCICTL1.bit.SWRESET = 0;
DELAY_US(1000);
ScibRegs.SCICTL1.bit.SWRESET = 1;
}
// 正常SCI中断函数
// ...
// ...
// ...
PieCtrlRegs.PIEACK.bit.ACK9 = 1;
EINT;
}
基于ChatGpt Plus版参考回答:出现收到但无法发送数据的问题可能是由于以下几个原因引起的:
波特率设置不匹配:确保上位机和下位机之间的波特率设置一致。检查您的代码或配置,确保两端的串口波特率设置相同。
数据格式错误:检查数据格式是否正确,包括数据位、停止位和奇偶校验位等。确保上位机和下位机的数据格式设置相匹配。
硬件连接问题:检查串口连接是否正确,包括引脚连接、线缆连接和终端电阻设置等。确保RS485通信的收发线路连接正确,并且终端电阻已经正确设置。
发送数据缓冲区溢出:如果您的下位机发送数据过于频繁或发送数据量较大,可能会导致发送缓冲区溢出。确保发送数据的频率和数据量在下位机能够处理和发送的范围之内。
软件配置错误:检查您的代码或配置,确保正确设置了串口的发送和接收功能,并且使能了相关的中断或标志位。