Raspberry pi pico の C++ のサンプルコードです。
- Raspberry pi pico は USB-serial 通信で1 byte 以上のデータを受信すると (受信データの数 + 1 byte) のデータを返信します
- Raspberry pi pico は受信データの最初の 1 byte の値の回数だけ LED を点滅させます
- Raspberry pi pico の返信データの 1 byte目は受信したデータ数 (byte数)、2 byte目以降は受信データをそのまま返信します
USB-Serial 通信アプリの動作確認用に作成しました。
プロジェクトフォルダ: pico_test
pico_test |-- pico_sdk.import.cmake |-- CMakeLists.txt |-- module_serial | |-- module_serial.h | |-- module_serial.c | -- CMakeLists.txt -- test_01 |-- test_01.c -- CMakeLists.txt
pico_test\CMakeLists.txt
cmake_minimum_required(VERSION 3.12) # Pull in SDK (must be before project) include(pico_sdk_import.cmake) project(pico_ctrl C CXX ASM) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR}) # Initialize the SDK pico_sdk_init() include(example_auto_set_url.cmake) # Add subdirectory add_subdirectory(test_01) add_subdirectory(module_serial)
pico_test\module_serial\module_serial.h
#ifndef MODULE_SERIAL_H #define MODULE_SERIAL_H uint32_t serial_available(); uint32_t serial_read(uint8_t *read_data, int read_data_length); uint32_t serial_write(uint8_t *write_data, int write_data_length); uint32_t serial_write_1byte(uint8_t write_data); #endif
pico_test_module_serial\module_serial.c
#include <stdio.h> #include "pico/stdlib.h" #include "class/cdc/cdc_device.h" #include "./module_serial.h" uint32_t serial_available(){ return tud_cdc_available(); } uint32_t serial_read(uint8_t *read_data, int read_data_length){ return tud_cdc_read(read_data, read_data_length); } uint32_t serial_write(uint8_t *write_data, int write_data_length){ uint32_t uintTMP; uintTMP = tud_cdc_write(write_data, write_data_length); tud_cdc_write_flush(); return uintTMP; } uint32_t serial_write_1byte(uint8_t write_data){ int i = 0; uint8_t write_data_buffer[1]; write_data_buffer[0] = write_data; while(tud_cdc_write_available() < 1){ sleep_ms(1); i++; if(i > 1000){ tud_cdc_write_clear(); } } uint32_t uintTMP = tud_cdc_write(write_data_buffer, 1); tud_cdc_write_flush(); return uintTMP; }
pico_test\module_serial\CMakeLists.txt
add_library(module_serial module_serial.c ) # Pull in our pico_stdlib which pulls in commonly used features target_link_libraries(module_serial pico_stdlib) # enable usb output, disable uart output pico_enable_stdio_usb(module_serial 1) pico_enable_stdio_uart(module_serial 0)
pico_test\test_01\test_01.c
#include <stdio.h> #include "pico/stdlib.h" #include "../module_serial/module_serial.h" int main() { int i; int cntDAT; uint8_t getDAT[1]; uint8_t inDAT[256]; uint8_t outDAT[256]; stdio_init_all(); // Setup for Serial port const uint LED_PIN = PICO_DEFAULT_LED_PIN; gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); while (true) { cntDAT = 0; while(serial_available() > 0){ serial_read(getDAT, 1); inDAT[cntDAT] = getDAT[0]; cntDAT++; sleep_ms(10); } if(cntDAT > 0){ outDAT[0] = 0xFF & cntDAT; serial_write(outDAT, 1); serial_write(inDAT, cntDAT); for(i=0; i<inDAT[0]; i++){ gpio_put(LED_PIN, 1); sleep_ms(500); gpio_put(LED_PIN, 0); sleep_ms(500); } } sleep_ms(100); } }
pico_test\test_01\CMakeLists.txt
add_executable(test_01 test_01.c ) # Pull in our pico_stdlib which pulls in commonly used features target_link_libraries(test_01 pico_stdlib module_serial) # enable usb output, disable uart output pico_enable_stdio_usb(test_01 1) pico_enable_stdio_uart(test_01 0) # create map/bin/hex file etc. pico_add_extra_outputs(test_01) # add url via pico_set_program_url example_auto_set_url(test_01)