У меня есть действительно простой код, который читает с датчика ADS, который возвращает значение как int16_t
, Я знаю, что это значение всегда положительно, поэтому оно сохраняет память. Я храню его в массиве uint8_t
, Но я получаю действительно странное обращение — есть идеи?
Вот код:
int16_t ads0 = ads.readADC_SingleEnded(0);
int16_t ads1 = ads.readADC_SingleEnded(1);
PLUG_ADS[0][PLUG_ADS_IDX] = (uint8_t)ads0;
PLUG_ADS[1][PLUG_ADS_IDX] = (uint8_t)ads1;
Serial.print("ADS 0: ");
Serial.print(ads0);
Serial.print(" / ");
Serial.print(PLUG_ADS[0][PLUG_ADS_IDX]);
Serial.print(" ADS 1: ");
Serial.print(ads1);
Serial.print(" / ");
Serial.println(PLUG_ADS[1][PLUG_ADS_IDX]);
И вот вывод:
ADS 0: 791 / 23 ADS 1: 845 / 77
ADS 0: 792 / 24 ADS 1: 844 / 76
ADS 0: 794 / 26 ADS 1: 843 / 75
ADS 0: 790 / 22 ADS 1: 843 / 75
ADS 0: 792 / 24 ADS 1: 844 / 76
ADS 0: 793 / 25 ADS 1: 843 / 75
ADS 0: 794 / 26 ADS 1: 843 / 75
ADS 0: 791 / 23 ADS 1: 844 / 76
ADS 0: 790 / 22 ADS 1: 844 / 76
ADS 0: 793 / 25 ADS 1: 845 / 77
ADS 0: 791 / 23 ADS 1: 843 / 75
ADS 0: 792 / 24 ADS 1: 843 / 75
ADS 0: 791 / 23 ADS 1: 844 / 76
ADS 0: 792 / 24 ADS 1: 844 / 76
ADS 0: 791 / 23 ADS 1: 844 / 76
ADS 0: 792 / 24 ADS 1: 844 / 76
ADS 0: 794 / 26 ADS 1: 846 / 78
ADS 0: 793 / 25 ADS 1: 842 / 74
ADS 0: 793 / 25 ADS 1: 844 / 76
ADS 0: 793 / 25 ADS 1: 845 / 77
ADS 0: 793 / 25 ADS 1: 845 / 77
ADS 0: 793 / 25 ADS 1: 844 / 76
ADS 0: 797 / 29 ADS 1: 847 / 79
ADS 0: 792 / 24 ADS 1: 843 / 75
Какого черта я пропускаю?
uint8_t
является 8-разрядным целым числом без знака. Может представлять значения от 0 до 255.
int16_t
16-разрядное целое число со знаком Может представлять значения от -32768 до 32767. См. эта ссылка для списка значений, которые достигают целочисленного типа может представлять.
Когда вы преобразуете свою ценность (с (uint8_t)ads0;
) вы пытаетесь преобразовать значения порядка 790 в тип, который может представлять значения только до 255. Это приводит к потере данных.
Других решений пока нет …