你好!
遇到一个比较奇怪的问题。
程序比较简单,用SCI发送一个字符串,串口调试助手总是收不到最后两个字符,用示波器观察,示波器显示的波形跟串口调试助手收到的字符是对应的。但是我看到SCI寄存器的SCITXBUF已经写入了字符串的最后一个字符。
例如,我先定义一个字符串“abcdefg\0”, 用sci 查询发送,没有用FIFO,直到遇到‘\0’。但是串口调试助手只能收到abcde, 但是到最后SCITXBUF里面的是‘g’。
如果发送两个字符串,则第一个字符串里的字节会都收到,但是第二个字符串的最后两个字节会丢失。
实在想不出什么原因。
Seven Han:请先检查下波特率的设置;
还建议您换更个串口助手再做测试。
你好!
遇到一个比较奇怪的问题。
程序比较简单,用SCI发送一个字符串,串口调试助手总是收不到最后两个字符,用示波器观察,示波器显示的波形跟串口调试助手收到的字符是对应的。但是我看到SCI寄存器的SCITXBUF已经写入了字符串的最后一个字符。
例如,我先定义一个字符串“abcdefg\0”, 用sci 查询发送,没有用FIFO,直到遇到‘\0’。但是串口调试助手只能收到abcde, 但是到最后SCITXBUF里面的是‘g’。
如果发送两个字符串,则第一个字符串里的字节会都收到,但是第二个字符串的最后两个字节会丢失。
实在想不出什么原因。
user1775662:
回复 Seven Han:
应该不是波特率的问题,其他字符收的没问题,按照不同时钟下将波特率设置为同一值(9600),都为乱码。
串口调试助手都换了好几个了,同样的问题。
你好!
遇到一个比较奇怪的问题。
程序比较简单,用SCI发送一个字符串,串口调试助手总是收不到最后两个字符,用示波器观察,示波器显示的波形跟串口调试助手收到的字符是对应的。但是我看到SCI寄存器的SCITXBUF已经写入了字符串的最后一个字符。
例如,我先定义一个字符串“abcdefg\0”, 用sci 查询发送,没有用FIFO,直到遇到‘\0’。但是串口调试助手只能收到abcde, 但是到最后SCITXBUF里面的是‘g’。
如果发送两个字符串,则第一个字符串里的字节会都收到,但是第二个字符串的最后两个字节会丢失。
实在想不出什么原因。
Seven Han:
回复 user1775662:
试下TI的例程,scia_loopback_interrupts,不要用loop back模式,根据手册修改下波特率看下数据收发是否正确,排除下硬件的原因。
你好!
遇到一个比较奇怪的问题。
程序比较简单,用SCI发送一个字符串,串口调试助手总是收不到最后两个字符,用示波器观察,示波器显示的波形跟串口调试助手收到的字符是对应的。但是我看到SCI寄存器的SCITXBUF已经写入了字符串的最后一个字符。
例如,我先定义一个字符串“abcdefg\0”, 用sci 查询发送,没有用FIFO,直到遇到‘\0’。但是串口调试助手只能收到abcde, 但是到最后SCITXBUF里面的是‘g’。
如果发送两个字符串,则第一个字符串里的字节会都收到,但是第二个字符串的最后两个字节会丢失。
实在想不出什么原因。
user1775662:
回复 Seven Han:
好的,我明天先试下。
你好!
遇到一个比较奇怪的问题。
程序比较简单,用SCI发送一个字符串,串口调试助手总是收不到最后两个字符,用示波器观察,示波器显示的波形跟串口调试助手收到的字符是对应的。但是我看到SCI寄存器的SCITXBUF已经写入了字符串的最后一个字符。
例如,我先定义一个字符串“abcdefg\0”, 用sci 查询发送,没有用FIFO,直到遇到‘\0’。但是串口调试助手只能收到abcde, 但是到最后SCITXBUF里面的是‘g’。
如果发送两个字符串,则第一个字符串里的字节会都收到,但是第二个字符串的最后两个字节会丢失。
实在想不出什么原因。
mangui zhang:
回复 user1775662:
间隔发送的过程中增加一些延时或者判断上一次发送结束了再启动发送下一个试试
你好!
遇到一个比较奇怪的问题。
程序比较简单,用SCI发送一个字符串,串口调试助手总是收不到最后两个字符,用示波器观察,示波器显示的波形跟串口调试助手收到的字符是对应的。但是我看到SCI寄存器的SCITXBUF已经写入了字符串的最后一个字符。
例如,我先定义一个字符串“abcdefg\0”, 用sci 查询发送,没有用FIFO,直到遇到‘\0’。但是串口调试助手只能收到abcde, 但是到最后SCITXBUF里面的是‘g’。
如果发送两个字符串,则第一个字符串里的字节会都收到,但是第二个字符串的最后两个字节会丢失。
实在想不出什么原因。
user1775662:
回复 mangui zhang:
//=======================================================================================// FILE: test – main.c//=======================================================================================#include "DSP28x_Project.h"//—————————————————————————————// FUNCTION PROTOTYPES//—————————————————————————————void SciaSendByte(char a); // Send a character from the SCIvoid SciaSendMsg(char *msg); // Send a string from the SCIA//—————————————————————————————// VARIABLE DECLARATIONS – GENERAL//—————————————————————————————Uint16 ReceivedChar;char *msg;//=======================================================================================// MAIN CODE – starts here//=======================================================================================void main(void){ DisableDog(); // Disable the watchdog InitPieCtrl(); // Initializes the PIE control registers to a default state. IER = 0x0000; IFR = 0x0000; // Disable CPU interrupts and clear all CPU interrupt flags. InitPieVectTable(); // Initialize the PIE vector table. EALLOW; SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // Enable ADC peripheral clock (*Device_cal)(); SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 0; // Return ADC clock to original state EDIS; InitPll(DSP28_PLLCR, DSP28_DIVSEL); // Initialize the PLL control: PLLCR and CLKINDIV. EALLOW; SysCtrlRegs.LOSPCP.all = 0x0002; // low speed clock = SYSCLKOUT/4 22.5MHz@90MHz SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // Enable SCI-A clock EDIS; EALLOW; GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // set GPIO28 = SCIRXDA GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pull-up for GPIO28 (SCIRXDA) GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3; // Asynchronous input GPIO28 (SCIRXDA) GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // set GPIO29 = SCITXDA //GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // Enable pull-up for GPIO29 (SCITXDA) GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // set GPIO34 as DE of RS485 GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // set GPIO34 output GpioDataRegs.GPBSET.bit.GPIO34 = 1; // set GPIO34 output high initially(set RS485 send) EDIS; // Initiate SCI-A SciaRegs.SCICCR.all =0x0007; // 1 stop bit, 8 char bits, No parity, // No loopback, async mode, idle-line protocol SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE SciaRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 22.5MHz (90 MHz SYSCLK). SciaRegs.SCILBAUD =0x0024; SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset. SciaSendByte('a'); DELAY_US(5000); SciaSendByte('b'); SciaSendByte('c'); msg = "\r\nHello World!\0"; SciaSendMsg(msg); msg = "\r\nYou will enter a character, and the DSP will echo it back!\0"; SciaSendMsg(msg); //———————————————————————————– // MAIN LOOP //———————————————————————————– for(;;) //infinite loop { msg = "\r\nEnter: \0"; SciaSendMsg(msg); //DELAY_US(5000); //GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1; // set rs485 receive // Wait to receive a character while(SciaRegs.SCIRXST.bit.RXRDY == 0) ; ReceivedChar = SciaRegs.SCIRXBUF.all; // Get the character //DELAY_US(5000); //GpioDataRegs.GPBSET.bit.GPIO34 = 1; // set rs485 send // Echo character back msg = " You sent: \0"; SciaSendMsg(msg); SciaSendByte(ReceivedChar); } // END OF MAIN LOOP} //END MAIN CODE// send a character from the SCI-Avoid SciaSendByte(char a){ while(!(SciaRegs.SCICTL2.bit.TXRDY)) ; SciaRegs.SCITXBUF = a;}// send a string from the SCI-Avoid SciaSendMsg(char *msg){ int i = 0; while(msg[i] != '\0'){ SciaSendByte(msg[i]); i++; }}//=======================================================================================// End of file.//=======================================================================================
先把程序贴上来,都整到这一个文件里了。
昨天我用的是RS485,在主函数里有一个设置发送和接收(GPIO34),今天先加入了延时(DELAY_US(5000);),发现可以接收到所有字符。换了个板子用
RS232试,就不用加这个延时,因为RS232不用设置发送和接收。
但是无论是RS485还是RS232,我在main函数前用发送单个字符测试,就发送一个字符‘a’,如果不加延时,单步运行就收不到。加了延时,单步运行到延时结束才能收到。不加延时,只有单步运行完SciaSendByte('c');才能收到字符‘a’。
我觉得挺奇怪的。难道我的发送单个字符的函数有问题还是SCI设置有问题?