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();
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)