CDC Basic
Microchipの作ったデモは「文字を読んだら+1して返す」というものになっている。
void MCC_USB_CDC_DemoTasks(void) {
if( USBGetDeviceState() < CONFIGURED_STATE ) return;
if( USBIsDeviceSuspended()== true ) return;
if( USBUSARTIsTxTrfReady() == true) {
uint8_t i;
uint8_t numBytesRead;
numBytesRead = getsUSBUSART(readBuffer, sizeof(readBuffer));
for(i=0; i<numBytesRead; i++) {
switch(readBuffer[i]) {
case 0x0A:
case 0x0D:
writeBuffer[i] = readBuffer[i];
break;
default:
writeBuffer[i] = readBuffer[i] + 1;
break;
}
}
if(numBytesRead > 0) putUSBUSART(writeBuffer,numBytesRead);
}
CDCTxService();
}
これを利用して「PCから送られた1文字を読んで、それが0x05(ENQ)だったら温湿度センサーに測定開始コマンドを送り、少し待って温湿度センサーのデータを6バイト読んで、PCに返す」というのを書いた(つもりだった)。
ところが1文字受信というのがどうもうまくいかない。試行錯誤して以下のようにしたらなんとかなった。
void USB_CDC_Tasks(void) {
uint8_t n;
if( USBGetDeviceState() < CONFIGURED_STATE ) return;
if( USBIsDeviceSuspended()== true ) return;
n=getsUSBUSART(readBuffer, 1);
if(n==1 && readBuffer[0]==ENQ) {
rflg=1;
lpcnt=0;
I2C_WriteNBytes(ADDR,cmd,1);
LED_Toggle();
}
if(rflg) lpcnt++;
if(lpcnt>LPMAX) {
rflg=0;
lpcnt=0;
I2C_ReadNBytes(ADDR,writeBuffer,6);
putUSBUSART(writeBuffer,6);
}
CDCTxService();
}
Copilotぇ
最終的にはちゃんとできたが、途中でうまくいかないので悩んでCopilotと相談してみたが、こいつが嘘ばっかりだった。曰く「USBUSARTIsTxTrfReady()というのは受信とは関係ない。USBUSARTIsRxReady()を使ったらどうか。」
なるほどなるほど。でもUSBUSARTIsRxReady()なんて定義されていないじゃん。「それは関数でなくマクロで定義されているので()をつけないで」
なるほどなるほど。でもUSBUSARTIsRxReadyって定義はプロジェクト内にないんだけど? 「そう無いんだ。こんなふうに定義せよ」と、もうこのあたりにCopilotに見切りをつけた。
結局、While(1)ループするたびに1文字読んで、読み込み数が0でなければフラグを立てて測定開始する、という感じにした。USB接続でなければ単純に20msディレイをタスク内に入れるんだが、なんかループがすごい勢いで回っているので、Task内ではインクリメントするだけにした。
このループカウントが一定数を超える(だいたい20msになるよう調整)くらいでセンサーから読んで返す、という感じにしたらちゃんとできた。Copilotの嘘を検証するためにCopilotに相談するという無駄作業。ユーザが多くて良質な記事が多いPythonプログラムと、ユーザが少なく細かいところまで記事にしないPICプログラムとではやはり賢さが違うようだ。
投稿者の人気記事

-
akira.kei
さんが
前の金曜日の16:29
に
編集
をしました。
(メッセージ: 初版)
-
akira.kei
さんが
前の金曜日の16:32
に
編集
をしました。
Opening
syouwa-taro
前の土曜日の22:06
akira.kei
前の月曜日の19:55
ログインしてコメントを投稿する以前PICを愛用していましたがcompiler verを変えるとひどいときにはerrorでcompileできない事もありました。arduino ESP32に変えてからは安定しPICは終了。昔PICで作ったLCD電圧計は今でも現役動作していて懐かしいです。
ESP32もpicoも持っているのだが組み込んでしまうにはちょっと高すぎるので未だにPICは現役ですw