質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

6818閲覧

ArduinoでCAN受信した信号をシリアル通信しようとするエラーになる

HiroPokeHero

総合スコア45

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2019/08/15 02:40

前提・実現したいこと

ArduinoでCAN受信した信号をPCにシリアル通信で出力する際に
なぜかエラーになってしまいます。

前提として、
以前はエラーがなかったところに少しだけ変更をしただけなのに、
少し変更した部分にエラーが発生します。

大きく変えたところはPCからのシリアル信号を受信する部分だったのですが。。

やったこと

正常だったころのCAN受信部

if(!digitalRead(INT_PIN1)) // If CAN2_INT pin is low, read receive buffer { CAN2.readMsgBuf(&CAN2Id, &len, rxBuf); // Read data: len = data length, buf = data byte(s) if((CAN2Id & 0x80000000) == 0x80000000) // Determine if ID is standard (11 bits) or extended (29 bits) sprintf(msgString, " Extended ID: 0x%.8lX ", (CAN2Id & 0x1FFFFFFF)); else sprintf(msgString, " Standard ID: 0x%.3lX ", CAN2Id); Serial.print("Message Recieved Successfully! =>"); Serial.println(msgString); sprintf(msgString, "DLC: %1d Data:", len); Serial.print(msgString); //Serial.print(" DLC: %1d Data:", len); if((CAN2Id & 0x40000000) == 0x40000000){ // Determine if message is a remote request frame. sprintf(msgString, " REMOTE REQUEST FRAME"); Serial.print(msgString); } else { for(byte i = 0; i<len; i++){ sprintf(msgString, " 0x%.2X", rxBuf[i]); Serial.print(msgString); } } Serial.println(""); Serial.println(""); }

エラーが出るCAN受信部

if(!digitalRead(INT_PIN3)) // If CAN2_INT pin is low, read receive buffer { CAN3.readMsgBuf(&CANrxId, &len, rxBuf); // Read data: len = data length, buf = data byte(s) if((CANrxId & 0x80000000) == 0x80000000) // Determine if ID is standard (11 bits) or extended (29 bits) sprintf(msgString, " Extended ID: 0x%.8lX ", (CANrxId & 0x1FFFFFFF)); else //sprintf(msgString, "rx:%.3lX", CANrxId); sprintf(msgString, " Standard ID: 0x%.3lX ", CANrxId); Serial.print(msgString); //sprintf(msgString, "h,%1d", len); sprintf(msgString, "DLC: %1d Data:", len); Serial.print(msgString); if((CANrxId & 0x40000000) == 0x40000000){ // Determine if message is a remote request frame. sprintf(msgString, " REMOTE REQUEST FRAME"); Serial.print(msgString); } else { for(byte i = 0; i<len; i++){ //sprintf(msgString, ",%.2X", rxBuf[i]); sprintf(msgString, " 0x%.2X", rxBuf[i]); Serial.print(msgString); } } Serial.println(""); Serial.println(""); delay(100); // send data per 100ms }

定義部

long unsigned int CANrxId, CANtxId; unsigned char len = 0; unsigned char rxBuf[8]; String txData; uint8_t msgString[128]; // Array to store serial string int i = 0;

今回本当に変更したかったところ
(本当はシリアル信号に従ってCANの送信内容を調整したいが、
まずはシリアル信号の受信ができるところを確認する手前)

//txData = Serial.readStringUntil("\n"); //Serial.println(txData); CANtxId = 0x140;

発生している問題・エラーメッセージ

一部抜粋

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h:72:12: note: conversion of argument 1 would be ill-formed: D:\Arduino\CAN_Box3\CAN_Box3.ino:76:31: warning: invalid conversion from 'uint8_t* {aka unsigned char*}' to 'long int' [-fpermissive] Serial.print(msgString); ^ In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h:26:0, from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h:29, from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:232, from C:\Users\�_�a\AppData\Local\Temp\arduino_build_334818\sketch\CAN_Box3.ino.cpp:1: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h:73:12: note: candidate: size_t Print::print(long unsigned int, int) <near match> size_t print(unsigned long, int = DEC); ^ C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Print.h:73:12: note: conversion of argument 1 would be ill-formed: D:\Arduino\CAN_Box3\CAN_Box3.ino:76:31: warning: invalid conversion from 'uint8_t* {aka unsigned char*}' to 'long unsigned int' [-fpermissive] Serial.print(msgString); ^ exit status 1 no matching function for call to 'print(uint8_t [128])'

試したこと

エラーメッセージに従い、
エラー箇所を正常のころのものに一度戻す。

補足情報(FW/ツールのバージョンなど)

Windows10、
Arduino1.8.9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

no matching function for call to 'print(uint8_t [128])'

print関数はバイト配列を引数にはできないっていってますが、エラーのでた行の変数を確認してみては

投稿2019/08/15 02:45

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiroPokeHero

2019/08/15 02:55

そうなんですよね。 なので、エラー出たところをエラー出ていないスクリプトと同じにしたんですが。。。 また、 CANrxIdを設定してませんでしたが、事前にせ定しました。 (多分あまり意味がないのですが、デバッグのため)
y_waiwai

2019/08/15 02:58

Serial.print((char*)msgString); にしてみては。
HiroPokeHero

2019/08/15 04:27

char を使うことで解決しました。 ありがとうございます。
guest

0

最初の型宣言が間違っていました。

正:
char msgString[128];

投稿2019/08/15 04:28

HiroPokeHero

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問