主题中讨论的其他器件:C2000WARE

使用 sci 串行端口打印的数据不完整。
我在一些论坛上看到它与 printf 的重定向有关、我可以在哪里设置重定向? 有教程吗?
我使用"Console"窗口可以正常打印所有内容、但切换回串行端口打印数据未完成。
--
谢谢、此致
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

使用 sci 串行端口打印的数据不完整。
我在一些论坛上看到它与 printf 的重定向有关、我可以在哪里设置重定向? 有教程吗?
我使用"Console"窗口可以正常打印所有内容、但切换回串行端口打印数据未完成。
--
谢谢、此致
您好!
我假设这里使用了一个使用 SCI 的自定义 printf 解决方案、如下文中"使用 printf ()输出到用户定义的器件"一节所述:
https://dev.ti.com/tirex/explore/node?node=A__AIwt8bIK1yTVvzbnfYL0gg__ccs_devtools__FUz-xrs__LATEST
我将提请 C2000专家注意该主题、以获取进一步的帮助。
谢谢
小
您好、托莱多!
我是这个问题的作者、非常感谢您的回答。
我按照你的要求将代码烧录到了闪存中、并单击了 ccs10.1.0中的"断开"按钮、但从串行端口打印出来的数据仍然不完整、因此我对其进行了多次测试、以确保无法正常工作。
我的代码没有做任何更改、在之前的使用中、通常可以输出所有字符、但在使用"console"窗口后、使用"sci"串行端口再次打印输出时出现了问题。
下图显示了使用 CCS 串行助手打印的结果。

您可以看到数据不完整、并且存在奇怪的换行符。
如果需要、我愿意提供我的"sci.c"和"sci.h"文件、以及支持 sci 的"main.c"文件。
顺便说一下、这个问题与"printf"重定向有什么关系吗?
我们会尽快回复您的。
此致、
安迪
Andy、您好!
我想我看到了错误的通信:您是否期望有更多的小数位? 如果是这种情况、您使用的格式不正确。
您已选择"0.2f"。 这意味着浮点数只打印两个小数位。 这就是你没有得到更多小数位的原因。
基本上、您在 printf 中选择的格式不正确。
对于奇怪的换行符(文本前有空格)、这是由于回车(\r)未正确执行而引起的。 您是否可以尝试重新排列顺序来"\n\n"而不是"\r\n"? 我认为发生的情况是 printf 数据有时会使缓冲区溢出。 因此、您可能需要 printf 语句之间存在延迟(或使它们成为一个更大的 printf 语句)。
此致、
文斯
您好,托莱多,
感谢您的回答。
认为我看到了错误的通信:您是否期望有更多的小数位? 如果是这种情况、您使用的格式不正确。
您已选择"0.2f"。 这意味着浮点数只打印两个小数位。 这就是你没有得到更多小数位的原因。
[/报价]我不想得到任何更多的小数,上图是为了显示数据不是完全打印,你会发现"0.2f°"后的"°"没有打印,事实上,无论把什么字符放在"0.2f"后都不能打印。
对于因回车错误(\r)导致的奇怪换行符(文本前有空格)。 您是否可以尝试重新排列顺序来"\n\n"而不是"\r\n"? 我认为发生的情况是 printf 数据有时会使缓冲区溢出。 因此,您可能需要 printf 语句之间的延迟(或使它们成为一个更大的 printf 语句)。我尝试用"\n\n"替换"\r\n"、但它不起作用
我试图把主控从28335改为28035、但问题仍未解决。 我将完整的代码复制到了另一台计算机上,但我可以使用"sci"端口输出数据,这证明在我的计算机上 ccs10.1.0的配置可能存在问题!
因此我想卸载 ccs10.1.0并将其替换为 ccs12.5。 您认为这可能起作用吗?
您能否提供 TI 的官方"sci"使用代码? 您能否提供有关 printf 重定向的信息?
另请点击此链接:CCS6中printf () TMS320F28335工程printf——的使用()的使用_ccs printf-n CSDN博客
作为 DSP 学员、我不知道在哪里放置 NT fputc (int _c、register file *_ fp)函数。
我真的想要你的帮助。
sci.c 文件
/* * sci.c * * Created on: 2022年11月3日 * Author: 13739 */ #include "sci.h" #include "head.h" #include <stdio.h> #include <file.h> #include "DSP2803x_Project.h" Uart_Msg SCI_Msg={0, {0},0,0}; //#define SYSCLK 60000000L //################################################# //串口接收缓存处理函数 //----------------------------------------------- void handleRxFIFO() { if(SCI_Msg.Mark_Para.Status_Bits.rFifoDataflag == 1 ) { SCI_Msg.Mark_Para.Status_Bits.rFifoDataflag =0; while(SCI_Msg.rxReadIndex != SCI_Msg.rxWriteIndex) { SCI_Msg.rxReadIndex=(++SCI_Msg.rxReadIndex)%(UartRxLEN); } } } //################################################# //串口接收中断函数 //采用FIFO机制(缓存) //SCI_FIFO_LEN 定义为 1,最大为4 //----------------------------------------------- interrupt void uartRx_isr(void) { SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; if(SciaRegs.SCIFFRX.bit.RXFFOVF == 0)//接收FIFO未溢出 { SCI_Msg.Mark_Para.Status_Bits.rFifoDataflag = 1; //接收数据 while(SciaRegs.SCIFFRX.bit.RXFFST) { SCI_Msg.rxData[SCI_Msg.rxWriteIndex] = SciaRegs.SCIRXBUF.all; //接受低八位数据 SCI_Msg.rxWriteIndex=(++SCI_Msg.rxWriteIndex)%(UartRxLEN); } } else { //用户这里做串口硬件溢出的处理,可以完全读取出FIFO里的数据或者清空FIFO //这里清空FIFO操作 SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear HW Overflow flag SciaRegs.SCIFFRX.bit.RXFIFORESET = 0; //Write 0 to reset the FIFO pointer to zero, and hold in reset. SciaRegs.SCIFFRX.bit.RXFIFORESET = 1; //Re-enable receive FIFO operation } } //################################################# //----------------------------------------------- //串口初始化: //115200 8N1 // P21 框图介绍中断 //----------------------------------------------- void SCI_Init(Uint32 baud) { //设置串口波特率 unsigned char scihbaud=0; unsigned char scilbaud=0; Uint16 scibaud=0; scibaud=37500000/(8*baud)-1; scihbaud=scibaud>>8; scilbaud=scibaud&0xff; EALLOW; SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A EDIS; InitSciaGpio(); //SCI工作模式的设置 SciaRegs.SCICTL1.bit.SWRESET = 0;//sci 复位操作 SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol //1个停止位,无回环,无奇偶校验,8个字符位,异步模式,空闲线路协议 // baud = LSPCLK/8/((BRR+1) // baud @LSPCLK = 15MHz (60 MHz SYSCLK) // SciaRegs.SCIHBAUD =0x0000; // SciaRegs.SCILBAUD =15; //0xC2-->9600; 15-->115200(117187); 14-->128000(125000);3-->500000(468750) SciaRegs.SCIHBAUD =scihbaud; //此处有些不同 SciaRegs.SCILBAUD =scilbaud; SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset SciaRegs.SCIFFTX.bit.SCIRST=1; SciaRegs.SCIFFRX.bit.RXFFIL = SCI_FIFO_LEN; //设置FIFO深度=1 SciaRegs.SCICTL1.bit.TXENA = 1; //使能发送 SciaRegs.SCICTL1.bit.RXENA = 1; //使能接收 // SciaRegs.SCICTL2.bit.TXINTENA =1; // SciaRegs.SCICTL2.bit.RXBKINTENA =1; // SciaRegs.SCIFFTX.bit.TXFFIENA = 0; //禁止发送中断使能 //中断配置步骤-----1 SciaRegs.SCIFFTX.bit.SCIFFENA = 1; //使能FIFO中断 SciaRegs.SCIFFRX.bit.RXFFIENA=1; //中断配置步骤-----2 EALLOW; PieVectTable.SCIRXINTA = &uartRx_isr; EDIS; //中断配置步骤-----3 PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //中断配置步骤-----4 IER |= M_INT9; SciaRegs.SCIFFCT.all=0x00; SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1; SciaRegs.SCIFFRX.bit.RXFIFORESET=1; printf("\r\nSCI口 init...OK");//2023.7.13 zs 加 } //################################################# //----------------------------------------------- //发送一个字节 //----------------------------------------------- void scia_xmit(int a) { Uint32 WaitTimer = 0; //while (SciaRegs.SCIFFTX.bit.TXFFST != 0) while(SciaRegs.SCICTL2.bit.TXEMPTY != 1) //发送缓存寄存寄如果不为空,则等待执行 //waitTimer 时间 { WaitTimer++; if(WaitTimer > TIMEROUTSCI)break; } if(WaitTimer <= TIMEROUTSCI) SciaRegs.SCITXBUF=a; } //################################################# //----------------------------------------------- //发送字符串(待理解) //Enter,带回车换行次数 //----------------------------------------------- void sciPutString(char Enter1,char *s, char Enter2) { char i; for(i=0;i<Enter1;i++) { scia_xmit(0x0D); scia_xmit(0x0A); } while(*s!=0) { scia_xmit(*(s++)); } for(i=0;i<Enter2;i++) { scia_xmit(0x0D); scia_xmit(0x0A); } } //-------------------------------以下都为 标准 printf函数连接-------------------------------------------------------------- //################################################# //----------------------------------------------- //Printf 函数连接 //----------------------------------------------- void open_uart_debug (void) { int status=0; status = add_device("uart", _MSA, my_open, my_close, my_read, my_write, my_lseek, my_unlink, my_rename); if (status == 0) { freopen("uart:", "w", stdout); // open uart and redirect stdout to UART setvbuf(stdout, NULL, _IONBF, 0); // disable buffering for stdout } } int my_open(const char *path, unsigned flags, int fno) { //scia_fifo_init(); //scia_echoback_init(); path = path; flags = flags; fno = fno; return 0; } int my_close(int fno) { fno =fno; return 0; } int my_read(int fno, char *buffer, unsigned count) { fno = fno; buffer = buffer; count = count; return 0; } int my_write(int fno, const char *buffer, unsigned count) { int i=0; fno = fno; while(count-- > 0) { scia_xmit(buffer[i++]); } return count; } off_t my_lseek(int fno, off_t offset, int origin) { fno = fno; offset = offset; origin = origin; return 0; } int my_unlink(const char *path) { path = path; return 0; } int my_rename(const char *old_name, const char *new_name) { old_name = old_name; new_name = new_name; return 0; } //**************************** // No More //****************************sci.h 文件
/* * sci.h */ #ifndef APP_SCI_SCI_H_ #define APP_SCI_SCI_H_ #include "DSP2803x_Device.h" // DSP2833x 头文件 #include "DSP2803x_Examples.h" // DSP2833x 例子相关头文件 #include <stdio.h> #include <file.h> #define SCIBaudRate 115200L #define TIMEROUTSCI (Uint32)10*(SYSCLK/SCIBaudRate) //估算的等待超时时间,请根据实际修改 #define SCI_FIFO_LEN 1 //定义DSP串口FIFO深度 #define UartRxLEN 8 //接收缓存长度 #define UartTxLEN 1 //发送缓存长度 typedef struct Uart_Type{ union { Uint16 All; struct{ Uint16 UartRevFlag :1; //接收到数据标志 Uint16 rFifoDataflag :1; //接收内存非空 }Status_Bits; }Mark_Para; Uint16 rxData[UartRxLEN]; //接收缓存 Uint16 rxReadIndex; //接收FIFO写入索引:写入数据的长度? Uint16 rxWriteIndex; //接收FIFO读出索引:读出数据的长度? } Uart_Msg; extern Uart_Msg SCI_Msg; //函数声明 void handleRxFIFO(void); void SCI_Init(Uint32 baud); void usart1_send_byte(int a); void usart1_send_char(unsigned char * msg); void open_uart_debug (void); int printf(const char* str, ...); //标准 printf函数连接 int my_open(const char *path, unsigned flags, int fno); int my_close(int fno); int my_read(int fno, char *buffer, unsigned count); int my_write(int fno, const char *buffer, unsigned count); off_t my_lseek(int fno, off_t offset, int origin); int my_unlink(const char *path); int my_rename(const char *old_name, const char *new_name); #endif /* APP_SCI_SCI_H_ */main.c 文件:"sci"代码仅出现在 main.c 中。
/* * main.c * * */ #include "DSP2803x_Device.h" // DSP2833x Headerfile Include File #include "DSP2803x_Examples.h" // DSP2833x Examples Include File #include "DSP2803x_Project.h" #include "math.h" #include "IQmathLib.h" #include "head.h" #include "stdio.h" #include "bmp280.h" #include "leds.h" extern Uint16 RamfuncsLoadSize; float pitch,roll,yaw; //欧拉角 short aacx,aacy,aacz; //加速度传感器原始数据 short gyrox,gyroy,gyroz; //陀螺仪原始数据 short magx,magy,magz; //磁力计原始数据 short temp; //温度 void main() { //long BMP_Pressure; // double BMP_Pressure,BMP_Temperature;//压力和温度 //double BMP_Pressure; InitSysCtrl();//系统时钟初始化,默认已开启F28335所有外设时钟 InitGpio(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); //复制对时间敏感代码和FLASH配置代码到RAM中 // 包括FLASH初始化函数 InitFlash(); // 链接后将产生 RamfuncsLoadStart, RamfuncsLoadEnd, 和RamfuncsRunStart // 参数. 请参考 F28335.cmd 文件 memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (Uint32)&RamfuncsLoadSize); // 调用FLASH初始化函数来设置flash等待状态 // 这个函数必须在RAM中运行 InitFlash(); //////////////////////////////////////////// // SCI口初始化 //////////////////////////////////////////// SCI_Init(115200);//波特率115200(117187) open_uart_debug();//串口硬件连接到printf标准函数 printf("\r\n\r\n\r\nDSP is Ready"); printf("\r\nSCI口 init...OK"); /////////////////////////////////////////////// // GPIO口(LED)初始化 /////////////////////////////////////////////// LED_Init(); printf("\r\nLEDGPIO口...OK"); /////////////////////////////////////////// // I2C口初始化(MPU6050模块初始化) /////////////////////////////////////////// // MPU_Init(); //初始化MPU9250! // printf("\r\nMPU_Init init...OK"); //中断配置步骤-----5 PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block EINT; // Enable Global interrupt INTM ERTM;//请参看 使用须知 文件夹下的 分享--ERTM、DRTM 在DSP编程中的作用.pdf //mpu_dmp检测函数 //注意:杜邦线接短点,MPU6050放平 while(1) //初始化成功,则返回0,不运行下面的代码 //while(mpu_dmp_init()) //初始化成功,则返回0,不运行下面的代码 { //error = mpu_dmp_init(); printf("ERROR:%d\r\n",mpu_dmp_init()); switch (mpu_dmp_init()) { case 0:printf("DMP库初始化正常\r\n");break; case 1:printf("设置传感器库失败\r\n");break; case 2:printf("设置FIFO库失败\r\n");break; case 3:printf("设置采样率失败\r\n");break; case 4:printf("加载DMP固件失败\r\n");break; case 5:printf("设置陀螺仪方向失败\r\n");break; case 6:printf("设置DMP功能失败\r\n");break; case 7:printf("设置DMP输出速率失败\r\n");break; case 8:printf("自检失败\r\n");break; case 9:printf("使能DMP失败\r\n");break; case 10:printf("初始化MPU9250失败\r\n");break; default:printf("未知错误\r\n");break; } if(mpu_dmp_init() == 0)break; printf("\r\nmpu_dmp检测不正常!"); DELAY_US(500*1000); //LED2_TOGGLE; //LED灯D3闪烁,mpu_dmp检测不正常! } printf("\r\n实现功能:"); printf("\r\n发送加速度传感器数据aaci"); printf("\r\n发送陀螺仪值gyroi"); printf("\r\n发送欧拉角roll、pitch、yaw"); //陀螺仪采样率: 4~1000(Hz);目前是50Hz //roll:横滚角.单位0.01度。 (-90.0°, +90.0°) //pitch:俯仰角.单位 0.01度。(-180.0°, +180.0°) //yaw:航向角.单位为0.1度 (-180.0°, +180.0°) //温度值:扩大了100倍 //aaci加速度传感器原始数据:±2g //gyroi陀螺仪原始数据: ±2000dps while(1) { //MPU_Read(); //DATA_Report(); if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0) //获取欧拉角 { temp=MPU_Get_Temperature(); //获取温度值 MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //获取加速度传感器数据 MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //获取陀螺仪数据 MPU_Get_Magnetometer(&magx,&magy,&magz); //获取磁力计数据 printf("\n\r Pitch:%0.2f°;Roll:%0.2f°;Yaw:%0.2f°",pitch,roll,yaw); //显示欧拉角 printf("\n\r temp:%0.4d℃",temp); //显示温度 //printf("\r\n aacx :%0.4d ;aacy : %0.4d ;aacz :%0.4d ",aacx,aacy,aacz); //显示加速度传感器原始数据 //printf("\r\n gyrox:%0.4d ;gyroy: %0.4d ;gyroz:%0.4d ",gyrox,gyroy,gyroz); //显示陀螺仪原始数据 //printf("\r\n magx :%0.4d ;magy: %0.4d ;magz :%0.4d ",magx,magy,magz); //显示陀螺仪原始数据 printf("\n\r"); DELAY_US(200*1000); } DELAY_US(200*1000); } //end while(1) }此致、
安迪
[/quote]
Andy、您好!
您是否可以尝试将分号";"替换为"-"破折号? 我想有时分号可以被终端解释为行尾字符、我想知道这里是否发生了这种情况。
所以我想卸载 ccs10.1.0并替换为 ccs12.5。 您认为这可能起作用吗?
不错、另一个系统可能可以正常工作、因为旧版 CCS 中的 COMM 终端在看到分号时截断了文本。 我一定会首先尝试升级到 CCS12.5、看看这是否能解决问题。 另外、在 CCS10.1.0安装中也存在已知错误、升级可以帮助修复这些错误。
您能否提供 TI 官方的"sci"使用代码? 您能否提供有关 printf 重定向的信息?
对于上述问题、我们实际上在最新的 C2000Ware 中有一个示例、该示例准确地执行了您所需的操作、但对于另一个器件(f2838x 和更新的器件)则是如此。 示例名为"sci_ex4_stdout_redirect.c"
这应该会对您想要实现的目标有很大帮助。
此致、
文斯