回答編集履歴

4

さらにちょっとだけ追記

2023/11/12 00:15

投稿

thkana
thkana

スコア7733

test CHANGED
@@ -4,7 +4,7 @@
4
4
  このライブラリのdigitalWrite関数は(UNO r3等とは違って)pinModeがOUTPUTでない場合、OUTレジスタを変更せずにPULL UPを設定するようになっています(328とかの動作を再現するためでしょう)。
5
5
  一方、softwareSerialはTxが一瞬Lになることを防ぐため、先にdigtalWriteでピンをHにする(はずの)操作をしてからpinModeで出力にしています...UNO r3ならこれでよかったのですが、nano Everyの場合はこれが裏目に出て、TxピンがLになってしまい文字化けが発生する...ということのようです。
6
6
 
7
- とりあえずgithubのmegaAVRのリポジトリにIssueを投げておきましたので、いつか修正されるかも知れません。
7
+ とりあえずgithubのmegaAVRのリポジトリにIssue & pull requestを投げておきましたので、いつか修正されるかも知れません。
8
8
 
9
9
  (ちょっとそれだけでは説明しきれない振る舞いもある気がしますが...)
10
10
 

3

ちょっと追記

2023/11/11 22:06

投稿

thkana
thkana

スコア7733

test CHANGED
@@ -1,7 +1,7 @@
1
1
  とりあえず結論
2
2
  ---
3
3
  nano Everyは、ボードライブラリとして(UNO r3等とは違って)megaAVRライブラリ(現時点でバージョンは1.8.8)を使用しています。
4
- このライブラリのdigitalWrite関数は(UNO r3等とは違って)pinModeがOUTPUTでない場合、OUTレジスタを変更しないようになっています。
4
+ このライブラリのdigitalWrite関数は(UNO r3等とは違って)pinModeがOUTPUTでない場合、OUTレジスタを変更せずにPULL UPを設定するようになっています(328とかの動作を再現するためでしょう)
5
5
  一方、softwareSerialはTxが一瞬Lになることを防ぐため、先にdigtalWriteでピンをHにする(はずの)操作をしてからpinModeで出力にしています...UNO r3ならこれでよかったのですが、nano Everyの場合はこれが裏目に出て、TxピンがLになってしまい文字化けが発生する...ということのようです。
6
6
 
7
7
  とりあえずgithubのmegaAVRのリポジトリにIssueを投げておきましたので、いつか修正されるかも知れません。

2

発生原因一応判明

2023/11/10 12:54

投稿

thkana
thkana

スコア7733

test CHANGED
@@ -1,7 +1,18 @@
1
+ とりあえず結論
2
+ ---
3
+ nano Everyは、ボードライブラリとして(UNO r3等とは違って)megaAVRライブラリ(現時点でバージョンは1.8.8)を使用しています。
4
+ このライブラリのdigitalWrite関数は(UNO r3等とは違って)pinModeがOUTPUTでない場合、OUTレジスタを変更しないようになっています。
5
+ 一方、softwareSerialはTxが一瞬Lになることを防ぐため、先にdigtalWriteでピンをHにする(はずの)操作をしてからpinModeで出力にしています...UNO r3ならこれでよかったのですが、nano Everyの場合はこれが裏目に出て、TxピンがLになってしまい文字化けが発生する...ということのようです。
6
+
7
+ とりあえずgithubのmegaAVRのリポジトリにIssueを投げておきましたので、いつか修正されるかも知れません。
8
+
9
+ (ちょっとそれだけでは説明しきれない振る舞いもある気がしますが...)
10
+
11
+ ---
1
12
  対策としては先の回答で有効だったんですが、理屈は違うみたい(ちょっと追跡中)
2
13
 
14
+ (最初の回答)
3
15
  ---
4
- (最初の回答)
5
16
  SoftwareSerialの内部での初期化をしてからTXのラインがHである時間が十分でなくて、1文字目の波形が正しく調歩同期のデータとして解釈されないようです。
6
17
  とりあえず、
7
18
  ```Arduino
@@ -16,3 +27,4 @@
16
27
  もちろん、質問へのコメントにも書きましたが、ハードウェアSerialが余っているのならそちらを使うべきと思います。
17
28
 
18
29
  なお、言わせていただければ送信毎にシリアルポートをopen/close(begin/end)するのはあまり「普通の使い方」とは言えない気がします。
30
+

1

一部訂正

2023/11/07 00:28

投稿

thkana
thkana

スコア7733

test CHANGED
@@ -1,3 +1,7 @@
1
+ 対策としては先の回答で有効だったんですが、理屈は違うみたい(ちょっと追跡中)
2
+
3
+ ---
4
+ (最初の回答)
1
5
  SoftwareSerialの内部での初期化をしてからTXのラインがHである時間が十分でなくて、1文字目の波形が正しく調歩同期のデータとして解釈されないようです。
2
6
  とりあえず、
3
7
  ```Arduino