目录
轮询
ptintf
中断方式
DMA方式
轮询
串口要加入这两个文件
bug在于接到10个后会一直发送
ptintf
function buffPtr = convert(buff)if coder.target('Sfun')%固定句式%Executing in MATLAB, Buff is nullbuffPtr = uint32(0);
elsecoder.cinclude('getBuffPtr.h');%加入头文件 c includecoder.cinclude('stdio.h');string = char(zeros(1,20));%一个1*20的矩阵,二维数组 初始化stringSize = uint16(size(string,2));%取上一个变量的第二位即列向量,就是20,第一位是1% 相当于连写 %s\r\n加字符串结束符,后面按照%s格式转换stringFormat = char(['%s',13,10,0]);%13 10 0 对应\r\n\0 %coder.ceval(cfun_name,cfun_arguments) 使用参数 cfun_arguments 执行 cfun_name。%cfun_arguments 是按照 cfun_name 要求的顺序排列的逗号分隔的输入参数列表。%snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...)。%将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。并给其后添加一个字符串结束符('\0')%把buff按照coder.rref(stringFormat)格式发送给string,最多stringSize个%相当于把buff按照%s格式转换,\r\n保留,结束符为自动自带的,不进行发送% == printf("%s\r\n",buff)coder.ceval('snprintf',coder.wref(string),stringSize,coder.rref(stringFormat),buff); % c eval 重新运算求出参数的内容%调用c语言的getBuffPtr(),找到首地址buffPtr = coder.ceval('getBuffPtr',coder.rref(string));
end
end
源码
void untitled_step(void)
{char_T string_0[20];static const char_T stringFormat[5] = { '%', 's', '\x0d', '\x0a', '\x00' };uint8_T tmp[31];int32_T i;/* MATLAB Function: '<Root>/MATLAB Function' */for (i = 0; i < 31; i++) {tmp[i] = rtConstB.StringtoASCII[i];}snprintf(string_0, 20, stringFormat, tmp);rtDW.buffPtr = getBuffPtr(string_0);/* End of MATLAB Function: '<Root>/MATLAB Function' *//* S-Function (USART_Send): '<Root>/USART_Send' */{if (rtConstB.Add != 0) {/* Copy data to send. */TX_CopyData(&USART1_TxConf, (uint8_t*)rtDW.buffPtr, (uint16_t)rtConstB.Add);}if (USART1_TxConf.nb2Send) {rtDW.USART_Send = 0;USART1_TX_SendData(&USART1_TxConf);}if (USART1_TxConf.txStatus != SERIAL_TX_ON) {rtDW.USART_Send = USART1_TxConf.nbSent;}USART1_TxConf.txStatus = SERIAL_TX_OFF;}
}
中断方式
先在cubemx配置好中断
DMA方式